- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是,当我创建一个表时,例如:table1
包含以下列:
客户编号
客户姓名
地址
状态
其中 customerId
是带有 AUTO_INCREMENT
的 PRIMARY KEY
。
然后是 table2
,例如列:
purchaseId
客户编号
产品
费用
其中 PRIMARY KEY
是 purchaseId
,外键是 table1
中的 customerId
。
这应该意味着我已经使用customerId
在table1
和table2
之间建立了关系。
这两个表最初都是空的,所以我写了这个 SQL 命令:
INSERT INTO table1 (CustomerName,Address,State) VALUES('value1','value2','value3')
这工作正常,但是当我尝试插入子表 (table2
) 时,它告诉我:
ERROR a foreign key constraint
所以基本上我想做的是先插入父表,然后插入子表,这样 customerId
就会在 table2
(子表)中显示为外部key 对应table1
(父表)中的customerId
。
我必须先在没有外键的情况下创建两个表,然后再尝试建立关系吗?它一直在说,只要存在关系,就会存在约束。
最佳答案
table2 外键约束意味着任何 table2 customerId 值必须作为 table1 中的 customerId 出现。您收到错误是因为您将 customerID 插入到 table2 中,而 table1 中没有。
由于 DBMS 通过自动递增生成表 1 customerID,如果您插入一行,则必须获取该值才能将使用该 customerID 的行插入表 2。
我猜你说“I already established a relationship between table1 and table2”的意思是“我声明了一个外键约束”。我猜你认为这意味着“在我插入 table1 之后,当我插入 table2 时,DBMS 将使用自动生成的键值作为外键值”。但这并不意味着。你必须自己做。外键约束只是意味着 DBMS 检查每个 table2 customerId 值是否显示为 table1 customerId 值。
当您插入到具有该键的外键的表中时,您可以而且必须使用任何先前插入的键值作为相应的值。
要取回 DBMS 生成的自动递增键值,请使用 LAST_INSERT_ID() :
INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');
这就是它的用途。但是,如果您不使用它,就会出现问题。
首先,如果您不在序列化事务中,那么您必须使用 LAST_INSERT_ID()。因为在您的 table1 插入之后但在您的 table2 插入之前,其他人可能已经添加了行和/或删除了行,包括您的新行和/或更改了的行,包括您的新行。因此,您不能在 table1 的插入获得一些您知道已添加的 customerId 值后依赖查询 table1。
其次,假设您处于序列化事务中并且您不使用 LAST_INSERT_ID()。
如果 (CustomerName,Address,State)也是 table1 的 super 键,即它的值是唯一的,即在它的所有或部分列上声明了 SQL UNIQUE/KEY/PK,那么你可以使用它来查询关联的新 customerId:
set @customerId = (
SELECT customerId
FROM table1
WHERE CustomerName = 'value1'
AND Address = 'value2'
AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');
但是如果 (CustomerName,Address,State) 不是 table1 的 super 键,那么您不能这样做。因为与该子行重复的其他行可能在 table1 中。所以你可以得到多行。所以你不会知道哪个是最新的。相反,您必须在插入之前查询 table1,然后插入,然后找到新旧 customerId 集之间的差异:
CREATE TEMPORARY TABLE table1old (
customerId (int) PRIMARY KEY
);
INSERT INTO table1old
SELECT customerId FROM table1;
INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
set @customerId = (
SELECT customerId
FROM table1
WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');
只需使用 LAST_INSERT_ID()。
PS:有趣的是,给定表定义,理想情况下可以这样写:
INSERT INTO (
SELECT CustomerName,Address,State,A,B
FROM table1 JOIN table2
USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')
因为只有一对新的 table1 和 table2 值可以产生。 SQL 中有一些通过 View 进行的合法更新,但目前还没有涉及到 MySQL 中的多表
关于mysql - 如何在 phpMyAdmin 中设置表之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421055/
在 phpMyAdmin 的设置过程中,创建了一个 phpMyAdmin 用户,当我查看 phpMyAdmin 数据库权限时,我可以看到该用户。哪个 PHP 文件存储了该用户的密码? 最佳答案 保罗,
如何删除 phpMyAdmin 中的框架? 最佳答案 打开/usr/share/phpmyadmin/index.php(它在我的 Ubuntu 机器上)。不要忘记使用 sudo 或成为 root。
我读过官方文档说 phpMyAdmin 应该安装在 Web 服务器的文档根目录中。 我想问一下我是否必须为我拥有的每个 DocumentRoot 放置一个 phpMyAdmin,或者是否有一个很好的解
在遵循 youtube 上的 2019 教程后,无法在 virtualbox 上滚动的 kali linux 上安装 phpmyadmin, 尝试过 sudo apt-get install phpm
请帮忙,我总是在经历所有这些事情时遇到麻烦。当我只需要 phpmyadmin 有一个登录表单时,我就可以输入密码和用户名。 我不需要本文档中包含的所有内容。是否有针对初学者的教程,介绍如何在 phpm
标题几乎总结了我的问题。 我只想了解如何禁用远程登录到我的 phpmyadmin。 我宁愿只能从本地主机登录到 phpmyadmin。 最佳答案 编辑 /etc/phpmyadmin/apache.c
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我创建了具有两列(id、name)的数据库(产品)表项目,并且我向该列添加了值,然后显示此错误 Warning in .\libraries\DisplayResults.php#869 A non
我想将 SELECT 查询的结果导出为有效的 SQL INSERTS,并将其导入到另一个数据库中(某些记录被意外删除)。通常我会使用 PHPMyAdmin 的导出功能,但 PHPMyAdmin 在其中
当我尝试从 phpMyAdmin 导出数据库时出现错误。 请引用下面的截图。 我不知道这个问题是怎么发生的。 最佳答案 我遇到了同样的问题,我通过增加 php.ini 中 'max_input_var
无法访问 phpMyAdmin。我的 wampserver 版本是 2.2,使用 Windows 7。 localhost/phpmyadmin/ 当我打开它。 Internet Explorer 打
在我的工作中,我有 phpmyadmin 要使用的 SQL 数据库(本地和服务器上) 烦人的问题是,当我修改本地数据库结构(列、关系、新表)时,我不得不在服务器数据库上再次重做修改,因为当我备份本地数
我不喜欢 phpMyAdmin 中新的 AJAX 风格的导航树,我想将其更改为旧的。是否有一些我可以更改的配置指令? 旧版本:3.3.7 新版本:4.0.4 两者中的原始主题。 最佳答案 没有配置指令
我正在尝试更改 phpmyadmin 中的日期格式。我无法更改格式 我想将格式更改为 dd-mmm-yyyy。如何更改日期格式。请帮我解决它.. 最佳答案 您可以使用 phpMyAdmin 的 bro
我想在 PhpMyAdmin 中为包含此文本的所有字段更改文本“pelecard”。表名是 sales_flat_order_payment。我怎么能做到这一点? 谢谢你 最佳答案 SQL 是什么?
在远程 ubuntu 18 服务器上,当从其中一个表中打开 phpmyadmin 中的数据时,它会显示警告和弹出窗口(如 https://imgur.com/a/b5HGGV0 ),这是非常缺乏的..
默认情况下,phpMyAdmin 中的“主题”选项仅影响主题设置更改的浏览器的主题(可能存储在 cookie 中?)。如何将特定主题设置为所有用户的默认主题? 最佳答案 可以从 phpMyAdmin
我的表有全文列。如何设置列的默认宽度?我知道它在 index.php 页面顶部有完整/部分文本按钮...如何永久设置该值? 谢谢! 最佳答案 有一个名为 LimitChars 的配置值:http://
我是 mysql 的新手,所以我正在使用 phpmyadmin 在数据库中创建表。我有枚举类型的字段制造商,可能的值为“manufacturer1”,“manufacturer2”,... 我选择了
有谁知道是否或如何增加phpMyAdmin 中的导入大小限制?目前我的服务器限制为 50MB。 请注意,这与 php.ini 中的 upload_max_filesize 不同。该值设置为 2MB。
我是一名优秀的程序员,十分优秀!