Tengo las siguientes tablas,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
¿Cómo modifico la messages
tabla de manera que,
sender
se le agrega una nueva columna llamada- donde
sender
hay una clave externa que hace referencia a lausers
tabla
Esto no funciono
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
¿Esta declaración no crea la columna también?
postgresql
foreign-key
alter-table
Hassan Baig
fuente
fuente
Respuestas:
Lo que es relativamente fácil: solo tiene que agregar otro paso.
La
FOREIGN KEY
columna tiene que existir para que sea unaFK
. Hice lo siguiente (desde aquí y la documentación ):Un par de puntos a tener en cuenta:
SIEMPRE dé a sus claves foráneas nombres significativos. Que nos digan que se está violando la clave "SYS_C00308108" no es muy útil. Vea el violín aquí para ver el comportamiento de Oracle en estas circunstancias, el nombre de la clave variará de un violín a otro, pero es una cadena arbitraria que comienza con SYS _...)
Considerando su declaración:
Sería "agradable tenerlo" si el RDBMS pudiera crear automáticamente el campo que desea con el tipo de datos que coincida con el campo referenciado. Todo lo que diría es que cambiar DDL es (o al menos debería ser) una operación raramente utilizada y no algo que desearía hacer regularmente. También corre el riesgo de agregarse a una documentación ya bastante sustancial.
Al menos PostgreSQL intenta hacer algo razonable: concatena el nombre de la tabla, el nombre del
FOREIGN KEY
campo_fkey
e incluso se agregaDETAIL: Key (sender_id)=(56) is not present in table "user_".
para dar algo que podría tener sentido para un ser humano; vea el violín aquí .fuente
"y_z_fkey"
. Yo diría que es un nombre mejor quey_x_fkey
debido a que su violación no le dice la columna vas a insertar en el que está causando el error. Me importa menos dónde está apuntando. Como regla general, NUNCA debe nombrar sus fkeys y dejar que el valor predeterminado de PostgreSQL lo maneje.ON UPDATE CASCADE ON DELETE CASCADE;
en un ejemplo, especialmente sin razón. Hace que el ejemplo sea más complejo y no te molestes en explicar de qué se trata. Por mi parte, normalmente no quiero eliminaciones en cascada.y_x_fkey
oy_z_fkey
ox__y_FK
, siempre y cuando sea consistente.No estoy seguro de por qué todos te dicen que debes hacer esto en dos pasos. De hecho, no lo haces . Intentó agregar uno
FOREIGN KEY
que asume, por diseño, que la columna está allí y arroja ese error si la columna no está allí. Si agrega elCOLUMN
, puede convertirlo explícitamente en unaFOREIGN KEY
creación conREFERENCES
,Funcionará bien Puedes ver la sintaxis de
ALTER TABLE
aquí,Con "acción" como,
Estos ejemplos están incluso en los documentos,
Pero todo eso no es necesario porque podemos confiar en el autonaming y la resolución de la clave principal (si solo se especifica el nombre de la tabla, entonces está haciendo referencia a la clave principal).
fuente
CASO1: si necesita crear una clave externa mientras crea una nueva tabla
Los comandos anteriores crearán una tabla con el nombre 'table1' y tres columnas llamadas 'id' (Clave primaria), 'column1', 'table2_id' (clave foránea de table1 que hace referencia a la columna id de table2).
DATATYPE 'serial' hará que la columna que usa este tipo de datos como una columna generada automáticamente, cuando inserte valores en la tabla no necesite mencionar esta columna en absoluto, o puede dar 'default' sin comillas en el lugar del valor.
Siempre se agrega una columna de clave principal al índice de la tabla con el valor 'tablename_pkey'.
Si se agrega una clave foránea en el momento de la creación de la tabla, se agrega una CONSTRAINT con el patrón '(present_table_name) _ (foreign_key_id_name) _fkey'.
Al agregar una clave foránea, debemos ingresar la palabra clave 'REFERENCES' al lado del nombre de la columna porque queremos decirle a los postgres que esta columna hace referencia a una tabla y luego, al lado de las referencias, tenemos que dar la tabla como referencia y entre paréntesis dar el nombre de la columna de la tabla a la que se hace referencia, generalmente las claves foráneas se dan como columnas de clave principal.
CASO 2: si desea una clave externa para una tabla existente en una columna existente
NOTA: los corchetes '()' después de FOREIGN KEY y REFERENCES tabel2 son obligatorios o, de lo contrario, postgres arrojará un error.
fuente
Yo se el problema Los nombres de las columnas son diferentes. Tal vez en una columna, hay un espacio adicional después del nombre de la columna, así que asegúrese de que los nombres de las columnas tengan el mismo nombre.
fuente