Table A
(
Table_A_ID int
)
Table B
(
Table_B_ID int
Value int
)
假设我想将数据插入表 B,其中“值”与 Table_A_ID 相同。我将如何进行约束或检查插入时表中是否确实存在数据?
Table A
(
Table_A_ID int
)
Table B
(
Table_B_ID int
Value int
)
假设我想将数据插入表 B,其中“值”与 Table_A_ID 相同。我将如何进行约束或检查插入时表中是否确实存在数据?
您可能不仅需要在 INSERT 到表 B 中强制执行数据完整性,还需要在两个表中的 UPDATE 和 DELETE 上强制执行数据完整性。
无论如何选择是:
大多数情况下首选的方法是外键约束。
是的,我同意@peterm。
原因,如果您的两者Table_A_ID
和Table_B_Id
都是两个表的主键,那么您甚至不需要两个表来存储value
. 因为,你的两张桌子似乎是“一对一”的关系。这是数据库完整性问题之一。
我认为您没有对此数据库进行适当的规范化。
只是建议一个好主意!
在表 B 上引用“Table_A_ID”列的“值”列上创建外键约束。
这样做只会允许将表 A 中存在的值添加到表 B 的“值”字段中。
为此,您首先需要使 Table_A_ID 列成为表 A 的主键,或者至少必须对其应用某种唯一约束才能成为外键候选者。
BEGIN TRANSACTION -- REMOVE TRANSACTION AND ROLLBACK AFTER DONE TESTING
--PUT A PRIMARY KEY ON TABLE A
CREATE TABLE A
( Table_A_ID int CONSTRAINT PK_A_Table_A_ID PRIMARY KEY)
--ON VALUE ADD A FOREIGN KEY CONSTRAINT THAT REFERENCEs TABLE A
CREATE TABLE B
( Table_B_ID int,
[Value] int CONSTRAINT FK_B_Value_A REFERENCES A(Table_A_ID)
)
-- TEST VALID INSERT
INSERT A (Table_A_ID) VALUES (1)
INSERT B (Table_B_ID, [Value]) VALUES (1,1)
--NOT ALLOW TO INSERT A VALUE THAT DOES NOT EXIST IN A
--THIS WILL THROW A FOREIGN KEY CONSTRAINT ERROR
INSERT B (Table_B_ID, [Value]) VALUES (1,2) -- 2 DNE in table A
ROLLBACK
注意:'FK_B_Value_A' 或 'PK_A_Table_A_ID' 没有什么魔力,它只是一个命名约定,可以被称为任何东西。外键和主键行的语法如下:
column-definition CONSTRAINT give-the-constraint-a-name REFERENCES table-name ( table-column )
column-definition CONSTRAINT give-the-constraint-a-name PRIMARY KEY