Table A
(
Table_A_ID int
)
Table B
(
Table_B_ID int
Value int
)
假设我想在表B中插入数据,其中'Value'与Table_A_ID相同。 如何在插入表格中制作约束或检查数据是否实际存在?
答案 0 :(得分:1)
您可能不仅要在表B中插入INSERT,还要在两个表中的UPDATE和DELETE上强制执行数据完整性。
无论如何选项都是:
在大多数情况下,首选方式是FOREIGN KEY CONSTRAINT。
答案 1 :(得分:0)
因为,如果您的Table_A_ID
和Table_B_Id
都是两个表的主键,那么您甚至不需要两个表来存储value
。因为,你的两张桌子似乎是“一对一”的关系。这是数据库完整性问题之一。
我认为您没有对此数据库进行适当的规范化 只是建议一个好主意!
答案 2 :(得分:0)
我找到了this example,它演示了如何设置外键约束。
CREATE TABLE employee (
id smallint(5) unsigned NOT NULL,
firstname varchar(30),
lastname varchar(30),
birthdate date,
PRIMARY KEY (id),
KEY idx_lastname (lastname)
) ENGINE=InnoDB;
CREATE TABLE borrowed (
ref int(10) unsigned NOT NULL auto_increment,
employeeid smallint(5) unsigned NOT NULL,
book varchar(50),
PRIMARY KEY (ref)
) ENGINE=InnoDB;
ALTER TABLE borrowed
ADD CONSTRAINT FK_borrowed
FOREIGN KEY (employeeid) REFERENCES employee(id)
ON UPDATE CASCADE
ON DELETE CASCADE;
注意:这告诉MySQL我们要通过添加名为borrowed table
的约束来更改‘FK_borrowed’
。 employeeid column
将引用id column
中的employee table
- 换句话说,员工必须存在才能借书。
最后两行可能是最有趣的。他们声明,如果更新员工ID或删除员工,则应将更改应用于borrowed table
。
注意:有关详细信息,请参阅上述网址,这只是该文章的摘录!
答案 3 :(得分:0)
在引用“ Table_A_ID”列的表B的“值”列上创建外键约束。
这样做只会将表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'并不神奇,它只是一个命名约定而被称为任何东西。外键行和主键行的语法如下:
列定义约束给出约束名称参考表名称(表列)
列定义约束给出约束名称主键