旧的mysql错误(侦探故事)
#sql #mysql #bug

在本文中,我想描述我在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。