У меня есть следующие таблицы,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Как мне изменить messages
таблицу так, чтобы,
sender
к нему добавляется новый столбец с именем- где
sender
внешний ключ ссылается наusers
таблицу
Это не сработало
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Разве это утверждение не создает колонку?
postgresql
foreign-key
alter-table
Хасан Бэйг
источник
источник
Ответы:
Что относительно просто - нужно просто добавить еще один шаг.
FOREIGN KEY
Столбец должен существовать для того , чтобы сделать этоFK
. Я сделал следующее ( отсюда и документация ):Несколько замечаний:
ВСЕГДА дайте своим внешним ключам осмысленные имена. Сказать, что ключ "SYS_C00308108" нарушается, не очень полезно. См. Здесь информацию о поведении Oracle в этих условиях. Имя ключа может быть разным от скрипки к скрипке, но это произвольная строка, начинающаяся с SYS _...)
Учитывая ваше заявление:
Было бы неплохо, если бы СУБД могла автоматически создавать желаемое поле с типом данных, соответствующим указанному полю. Все, что я хотел бы сказать, это то, что изменение DDL является (или, по крайней мере, должно быть) редко используемой операцией, а не тем, чем вы хотели бы заниматься регулярно. Это также рискует добавить к уже достаточно содержательной документации.
По крайней мере, PostgreSQL пытается сделать что-то разумное - он объединяет имя таблицы, имя
FOREIGN KEY
поля_fkey
и даже добавляет,DETAIL: Key (sender_id)=(56) is not present in table "user_".
чтобы дать что-то, что может иметь смысл для человека - см. Скрипку здесь .источник
"y_z_fkey"
. Я бы утверждать , что это лучше , чем имя ,y_x_fkey
потому что ваше нарушение не говорят вам , колонка вы вставка в это вызывает ошибку. Меня не волнует, куда он указывает. Как правило, вы НИКОГДА не должны называть свои fkeys и позволить стандартному PostgreSQL обрабатывать его.ON UPDATE CASCADE ON DELETE CASCADE;
в примере, особенно без причины. Это делает пример более сложным, и вы не будете объяснять, что это такое. Я, например, обычно не хочу, чтобы удаления каскадом.y_x_fkey
илиy_z_fkey
илиx__y_FK
, если это соответствует.Я не уверен, почему все говорят вам, что вы должны сделать это в два этапа. На самом деле, вы не делаете . Вы попытались добавить элемент,
FOREIGN KEY
который предполагает, что по умолчанию столбец существует, и выдает эту ошибку, если столбец отсутствует. Если вы добавитеCOLUMN
, вы можете явно сделать это приFOREIGN KEY
создании с помощьюREFERENCES
,Будет работать нормально. Вы можете увидеть синтаксис
ALTER TABLE
здесь,С «действием» как,
Эти примеры есть даже в документах,
Но все это не нужно, потому что мы можем положиться на автоименование и разрешение первичного ключа (если указано только имя таблицы, то вы ссылаетесь на первичный ключ).
источник
CASE1: если вам нужно создать внешний ключ при создании новой таблицы
Приведенные выше команды создадут таблицу с именем «table1» и тремя столбцами с именами «id» (первичный ключ), «column1», «table2_id» (внешний ключ table1, который ссылается на столбец id таблицы table2).
DATATYPE 'serial' сделает столбец, который использует этот тип данных, как автоматически сгенерированный столбец, при вставке значений в таблицу вам вообще не нужно упоминать этот столбец, или вы можете указать 'default' без кавычек в месте значения.
Столбец первичного ключа всегда добавляется в индекс таблицы со значением tablename_pkey.
Если внешний ключ добавляется во время создания таблицы, добавляется CONSTRAINT с шаблоном '(present_table_name) _ (foreign_key_id_name) _fkey'.
При добавлении внешнего ключа мы должны ввести ключевое слово «REFERENCES» рядом с именем столбца, потому что мы хотим сообщить postgres, что этот столбец ссылается на таблицу, а затем рядом со ссылками мы должны дать таблицу для справки и в скобках дать имя столбца ссылочной таблицы, обычно внешние ключи задаются в качестве столбцов первичного ключа.
СЛУЧАЙ 2: Если вы хотите, чтобы внешний ключ существующей таблицы существующего столбца
ПРИМЕЧАНИЕ: скобки '()' после FOREIGN KEY и REFERENCES tabel2 являются обязательными, иначе postgres выдаст ошибку.
источник
Я знаю проблему. Имена столбцов разные. Возможно, в одном столбце после имени вашего столбца есть дополнительный пробел, поэтому, пожалуйста, тщательно убедитесь, что имена ваших столбцов названы точно так же.
источник