Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql DBMS似乎在提交中间事务(新手问题)_Mysql_Sql_Database_Relational Database - Fatal编程技术网

Mysql DBMS似乎在提交中间事务(新手问题)

Mysql DBMS似乎在提交中间事务(新手问题),mysql,sql,database,relational-database,Mysql,Sql,Database,Relational Database,我使用的是巴达基,如下图所示: 使用下面的SQL脚本,我试图添加一本新书及其新作者和新流派(目前没有评分)(我和大多数学生一样使用MySQL): 我有两个问题:第一个问题是DBMS告诉我,我正在尝试添加一个元组,该元组包含引用表中不存在的引用(错误代码:1452。无法添加或更新子行:外键约束失败)。我的第一个问题是,使用事务的全部目的不是为了在事务完成之前不强制/检查约束吗?(在这种情况下,所有内容都应该在其位置,没有“空引用”)。我能够添加所有内容的唯一方法是每次按Excute按钮时只添加一行

我使用的是巴达基,如下图所示:

使用下面的SQL脚本,我试图添加一本新书及其新作者和新流派(目前没有评分)(我和大多数学生一样使用MySQL):

我有两个问题:第一个问题是DBMS告诉我,我正在尝试添加一个元组,该元组包含引用表中不存在的引用(错误代码:1452。无法添加或更新子行:外键约束失败)。我的第一个问题是,使用事务的全部目的不是为了在事务完成之前不强制/检查约束吗?(在这种情况下,所有内容都应该在其位置,没有“空引用”)。我能够添加所有内容的唯一方法是每次按Excute按钮时只添加一行。第二个问题是:我应该先添加主键还是先添加主键?我认为“显而易见”的答案是,我需要首先添加PK,但即使我在脚本中安排所有行,以便始终首先添加PK,我仍然会得到错误代码:1452,我可以添加所有内容的唯一方法是将脚本行一次一行地提供给DBMS。
很明显,在我对这应该如何工作的理解上有一些根本性的错误,我尝试在这里和谷歌上查找了很多次,但都找不到答案。

Alrghit,我找到了我正在做的事情。在关系图中,我把书和书的类型一对多联系起来,其中书的多方面是书,应该是相反的。我试着把它翻过来,到目前为止,我没有任何问题。

问题太多,无法写出正式的答案,但对于第一个问题,没有,事务一旦遇到问题就会失败。它不会尝试执行整个事务,因为契约规定MySQL必须回滚所有错误的整个事务,因此在这种情况下为什么还要执行更多代码呢。正如一位智者曾经说过的那样,“我不必吃一整条黄油就知道它是腐臭的。”事实上,没有什么东西会退却。如果我在faliure之前只得到第一个添加的值,我会检查(在继续添加任何其他内容之前),并且我尝试添加的值通常会在那时添加。
use booksdb;
start transaction;
insert into genre values ('Educational');
insert into books values ('123456789', 'Databases Illuminated',null, '1990,01,01' );
insert into book_genre values('123456789','Educational');
insert into authors(firstName, familyName) values ('Catherine','Ricardo');
insert into writes values('123456789',LAST_INSERT_ID());
COMMIT;