如何向现有SQLite表添加外键?
我有下表:如何向现有SQLite表添加外键?,sql,sqlite,foreign-keys,ddl,Sql,Sqlite,Foreign Keys,Ddl,我有下表: CREATE TABLE child( id INTEGER PRIMARY KEY, parent_id INTEGER, description TEXT); 如何在parent\u id上添加外键约束?假设启用了外键 大多数示例假设您正在创建表-我想将约束添加到现有的表中。您不能。 尽管将外键添加到表中的SQL-92语法如下所示: ALTER TABLE child ADD CONSTRAINT fk_child_parent
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
如何在parent\u id
上添加外键约束?假设启用了外键
大多数示例假设您正在创建表-我想将约束添加到现有的表中。您不能。 尽管将外键添加到表中的SQL-92语法如下所示:
ALTER TABLE child ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id)
REFERENCES parent(id);
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
SQLite不支持ALTER TABLE
命令()的ADD CONSTRAINT
变体
因此,在sqlite 3.6.1中添加外键的唯一方法是在CREATE TABLE
期间,如下所示:
ALTER TABLE child ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id)
REFERENCES parent(id);
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
不幸的是,您必须将现有数据保存到临时表中,删除旧表,使用FK约束创建新表,然后将数据从临时表中复制回来。()如果更改表并添加使用约束的列,则可以添加约束 首先,创建不带父\u id的表:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
description TEXT);
然后,更改表格:
ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);
如果您正在使用Firefox插件sqlite管理器,您可以执行以下操作: 不必再次删除和创建表,只需像这样修改即可 在“列”文本框中,右键单击列出的最后一个列名以打开关联菜单,然后选择“编辑列”。 请注意,如果表定义中的最后一列是主键,则必须首先添加新列,然后编辑新列的列类型,以便添加外键定义。 在“列类型”框中,添加逗号和
FOREIGN KEY (parent_id) REFERENCES parent(id)
数据类型后的定义。
单击“更改”按钮,然后单击“危险操作”对话框上的“是”按钮
参考:
请检查
SQLite直接支持的唯一模式更改命令是
如上所示的“重命名表格”和“添加列”命令。然而,
应用程序可以对表的格式进行其他任意更改
使用简单的操作序列。使其具有任意性的步骤
某些表X的架构设计更改如下:
ALTER TABLE child ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id)
REFERENCES parent(id);
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
首先在子表
Cid
中添加一列作为int
,然后使用下面的代码alter table
。这样,您可以添加外键Cid
作为父表的主键,并将其用作子表中的外键。。。希望它能帮助你,因为它对我有好处:
ALTER TABLE [child]
ADD CONSTRAINT [CId]
FOREIGN KEY ([CId])
REFERENCES [Parent]([CId])
ON DELETE CASCADE ON UPDATE NO ACTION;
GO
基本上你不能,但你可以绕过这种情况 将外键约束添加到现有表的正确方法是使用以下命令
db.execSQL("alter table child add column newCol integer REFERENCES parent(parent_Id)");
然后将父Id数据复制到newCol,然后删除父Id列。
因此,不需要临时表。是的,您可以,无需添加新列。为了避免损坏数据库,您必须小心正确地执行此操作,因此在尝试此操作之前,应该完全备份数据库 对于您的具体示例:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT
);
--- create the table we want to reference
create table parent(id integer not null primary key);
--- now we add the foreign key
pragma writable_schema=1;
update SQLITE_MASTER set sql = replace(sql, 'description TEXT)',
'description TEXT, foreign key (parent_id) references parent(id))'
) where name = 'child' and type = 'table';
--- test the foreign key
pragma foreign_keys=on;
insert into parent values(1);
insert into child values(1, 1, 'hi'); --- works
insert into child values(2, 2, 'bye'); --- fails, foreign key violation
或者更一般地说:
pragma writable_schema=1;
// replace the entire table's SQL definition, where new_sql_definition contains the foreign key clause you want to add
UPDATE SQLITE_MASTER SET SQL = new_sql_definition where name = 'child' and type = 'table';
// alternatively, you might find it easier to use replace, if you can match the exact end of the sql definition
// for example, if the last column was my_last_column integer not null:
UPDATE SQLITE_MASTER SET SQL = replace(sql, 'my_last_column integer not null', 'my_last_column integer not null, foreign key (col1, col2) references other_table(col1, col2)') where name = 'child' and type = 'table';
pragma writable_schema=0;
无论采用哪种方式,在进行任何更改之前,您可能首先要查看SQL定义:
select sql from SQLITE_MASTER where name = 'child' and type = 'table';
如果使用replace()方法,您可能会发现在执行之前,首先通过运行以下命令来测试replace()命令很有帮助:
select replace(sql, ...) from SQLITE_MASTER where name = 'child' and type = 'table';
您可以尝试以下方法:
ALTER TABLE [Child] ADD COLUMN column_name INTEGER REFERENCES parent_table_name(column_id);
如果对sqlite使用Db Browser,那么修改表就很容易了。您可以在现有表中添加外键,而无需编写查询
- 在数据库浏览器中打开数据库
- 只需在表上单击鼠标右键,然后单击“修改”
- 在那里滚动到外键列
- 双击要更改的字段
- 然后选择表及其字段并单击“确定”
就这样。您已成功将外键添加到现有表中。为现有SQLLite表创建外键: 对于SQLLite,没有直接的方法可以做到这一点。运行下面的查询以重新执行
CREATE TEMPORARY TABLE temp AS
SELECT
id,
parent_id,
description
FROM child;
DROP TABLE child;
CREATE TABLE child (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT,
FOREIGN KEY(parent_id) REFERENCES parent(id));
INSERT INTO child
( id,
parent_id,
description)
SELECT
id,
parent_id,
description
FROM temp;