在本文中,我想描述我在mysql中发现的一个错误,并从错误中意识到您可以做什么
我的电报聊天中的一个人问我:“我如何查看所有对特定表的外键引用?”我快速回答了他:“在Information_schema中查看它”,但是在那之后,我决定检查我的答案。
刚刚创建了简单的表test
和table ref1
,带有引用id
字段的字段:
create table test (
id int primary key,
first_name var char(20),
last_name var char(30)
);
create table ref1 (
id int primary key,
test_id int references test(id)
);
看起来很简单,因为我喜欢这个简短的语法。之后,我查看了information_schema
table REFERENTIAL_CONSTRAINTS
SELECT * FROM `information_schema`.`REFERENTIAL_CONSTRAINTS` WHERE REFERENCED_TABLE_NAME = 'test';
,找不到任何记录。 wtf?!这是不可信的!我喜欢这个语法并多次使用!
我用规范语法创建了另一个引用的表ref2
:
create table ref2 (
id int primary key,
test_id int,
foreign key (test_id) references test(id)
);
并再次检查。之后,我在REFERENTIAL_CONSTRAINTS
中播种记录。怎么可能?我很失望,决定在下一个测试案例中拯救我的思想:
-- add values to test case
insert into test values (1), (2);
-- add ref1 row referenced to first row in test table
insert into ref1(id, test_id) values (1, 1);
-- add ref2 row referenced to second row in test table
insert into ref2(id, test_id) values (1, 2);
现在,我认为,我将尝试从测试中删除第一行,并会遇到错误(我认为这是某些功能,而不是错误),但是MySQL丢弃此行而没有任何警告
delete from test where id = 1;
但是,当我尝试删除第二个表引用的第二个,我没有成功
delete from test where id = 2;
因此它不是特征,它是真正的错误! MySQL允许使用短的语法创建表格,而没有警告,但并未创建约束,并且不捍卫您的数据一致性OMG!
我在Google中看了看,发现该错误自2004年以来打开了https://bugs.mysql.com/bug.php?id=4919,但仍未修复。大家好?
我决定通过其他数据库运行此测试案例,并找到我可以在SQLize.online上测试的所有数据库允许简短的语法,并且所有数据库(MariadB,PostgreSQL,SQL Server,Oracle,Oracle,Oracle)在这两个案例中都创建了外键约束。 mysql和sqlite。