У меня есть следующая таблица:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
Как добавить ограничение внешнего ключа parent_id
? Предположим, что внешние ключи включены.
В большинстве примеров предполагается, что вы создаете таблицу - я бы хотел добавить ограничение к существующей.
sql
sqlite
foreign-keys
ddl
Дэйн О'Коннор
источник
источник
Ответы:
Вы не можете.
Хотя синтаксис SQL-92 для добавления внешнего ключа в вашу таблицу будет следующим:
SQLite не поддерживает на
ADD CONSTRAINT
вариантALTER TABLE
команды ( sqlite.org: SQL функций , которые SQLite не реализует ).Следовательно, единственный способ добавить внешний ключ в sqlite 3.6.1 - это выполнить
CREATE TABLE
следующие действия:К сожалению, вам придется сохранить существующие данные во временную таблицу, удалить старую таблицу, создать новую таблицу с ограничением FK, а затем скопировать данные обратно из временной таблицы. ( sqlite.org - FAQ: Q11 )
источник
RENAME TO
это один из немногихALTER TABLE
вариантов, который в настоящее время поддерживается в sqlite 3.Вы можете добавить ограничение, если измените таблицу и добавите столбец, который использует ограничение.
Сначала создайте таблицу без parent_id:
Затем измените таблицу:
источник
Пожалуйста, проверьте https://www.sqlite.org/lang_altertable.html#otheralter
источник
Да, можно без добавления нового столбца. Вы должны быть осторожны, чтобы сделать это правильно, чтобы не повредить базу данных, поэтому вам следует полностью создать резервную копию своей базы данных, прежде чем пытаться это сделать.
для вашего конкретного примера:
или в более общем плане:
В любом случае, вы, вероятно, захотите сначала увидеть, что такое определение SQL, прежде чем вносить какие-либо изменения:
Если вы используете подход replace (), вам может быть полезно перед выполнением сначала протестировать вашу команду replace (), запустив:
источник
Если вы используете надстройку sqlite-manager Firefox, вы можете сделать следующее:
Вместо того, чтобы отбрасывать и снова создавать таблицу, можно просто изменить ее вот так.
В текстовом поле «Столбцы» щелкните правой кнопкой мыши последнее имя столбца в списке, чтобы вызвать контекстное меню, и выберите «Изменить столбец». Обратите внимание, что если последний столбец в определении ТАБЛИЦЫ является ПЕРВИЧНЫМ КЛЮЧОМ, тогда необходимо будет сначала добавить новый столбец, а затем отредактировать тип столбца нового столбца, чтобы добавить определение FOREIGN KEY. В поле Тип столбца добавьте запятую и
определение после типа данных. Нажмите кнопку «Изменить», а затем нажмите кнопку «Да» в диалоговом окне «Опасная операция».
Ссылка: Sqlite Manager
источник
Вы можете попробовать это:
источник
В принципе, нельзя, но можно обойти ситуацию.
Правильный способ добавить ограничение внешнего ключа к существующей таблице - это следующая команда.
Затем скопируйте данные parent_Id в newCol и удалите столбец Parent_Id . Следовательно, нет необходимости во временной таблице.
источник
Сначала добавьте столбец в дочернюю таблицу
Cid
, какint
тогдаalter table
с кодом ниже. Таким образом, вы можете добавить внешний ключCid
в качестве первичного ключа родительской таблицы и использовать его в качестве внешнего ключа в дочерней таблице ... надеюсь, это поможет вам, поскольку это хорошо для меня:источник