Error: FOREIGN KEY relationship could not be added! #1452 - Cannot add or update a child row: a foreign key constraint fails
Error: FOREIGN KEY relationship could not be added! #1452 - Cannot add or update a child row: a foreign key constraint fails
我在尝试创建这两个 table 之间的关系时遇到了这个问题:
沃齐拉和
帐号
完整错误:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`shscodin_cars`.`#sql-123257_12d31ca`, CONSTRAINT `#sql-123257_12d31ca_ibfk_1` FOREIGN KEY (`id`) REFERENCES `vozila` (`vlasnik_id`))
我知道人们已经提出过类似的错误,但是通过查看他们的 tables 和答案,我无法弄清楚它如何适合我的情况,那就是为什么我要开始提问。
-我想达到什么目的?
因为我想创建一个 Web 应用程序,用它来显示有关车辆的信息(来自汽车 table),但当然我只想显示分配给特定用户的车辆,不是全部。
什么时候出现这个错误?
当我尝试在 table 之间(vozila 和帐户)建立关系时出现错误。
这是用于创建这两个 table 的代码:
CREATE TABLE `accounts` (
`id` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对于 vozila
CREATE TABLE `vozila` (
`id` int(11) NOT NULL,
`make` varchar(50) COLLATE utf8_bin NOT NULL,
`model` varchar(50) COLLATE utf8_bin NOT NULL,
`godina` int(50) NOT NULL,
`boja` varchar(50) COLLATE utf8_bin NOT NULL,
`vin` varchar(50) COLLATE utf8_bin NOT NULL,
`engine` varchar(50) COLLATE utf8_bin NOT NULL,
`tip` varchar(50) COLLATE utf8_bin NOT NULL,
`vlasnik` varchar(50) COLLATE utf8_bin NOT NULL,
`regoz` varchar(50) COLLATE utf8_bin NOT NULL,
`istek` date NOT NULL,
`odometer` varchar(50) COLLATE utf8_bin NOT NULL,
`napomena` varchar(50) COLLATE utf8_bin NOT NULL,
`vlasnik_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
--
-- Indexes for table `accounts`
--
ALTER TABLE `accounts`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `vozila`
--
ALTER TABLE `vozila`
ADD PRIMARY KEY (`id`),
ADD KEY `vlasnik_id` (`vlasnik_id`);
如您所见,vlasnik_id
用作 INDEX,我正在尝试在 vlasnik_id
(作为参考)和 id 之间创建关系作为 FOREIGN KEY。
有人能告诉我我在 table 的创作方面做出了正确的决定吗?我是否为网络应用程序或其他目的添加了正确的密钥?
如果你创建了这个外键:
ALTER TABLE accounts ADD FOREIGN KEY (id) REFERENCES vozila (vlasnik_id);
根据您的设置,创建该约束确实成功。
但是有两个问题
第一个问题:每个账号只能拥有一辆车。每个帐户仅存储在一行中,其 id
具有单个值。如果 id
必须引用 vozila
中的一行,那么它只能引用一辆车。我觉得应该允许一个账号拥有多辆汽车的可能性更大
第二个问题:必须先插入具有引用值的行,然后才能插入引用它的行。换句话说,您必须先插入到 vozila
,所有者的值在 vlasnik_id
,然后才能将行插入到 accounts
和 id
。这似乎倒退了。
如果你这样定义外键,两个问题都解决了:
ALTER TABLE vozila ADD FOREIGN KEY (vlasnik_id) REFERENCES account(id);
您首先创建一个帐户,然后插入一辆或多辆引用该车主 id
的汽车。一个账号可以拥有多辆汽车。
我在尝试创建这两个 table 之间的关系时遇到了这个问题: 沃齐拉和 帐号
完整错误:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`shscodin_cars`.`#sql-123257_12d31ca`, CONSTRAINT `#sql-123257_12d31ca_ibfk_1` FOREIGN KEY (`id`) REFERENCES `vozila` (`vlasnik_id`))
我知道人们已经提出过类似的错误,但是通过查看他们的 tables 和答案,我无法弄清楚它如何适合我的情况,那就是为什么我要开始提问。
-我想达到什么目的?
因为我想创建一个 Web 应用程序,用它来显示有关车辆的信息(来自汽车 table),但当然我只想显示分配给特定用户的车辆,不是全部。
什么时候出现这个错误?
当我尝试在 table 之间(vozila 和帐户)建立关系时出现错误。
这是用于创建这两个 table 的代码:
CREATE TABLE `accounts` (
`id` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对于 vozila
CREATE TABLE `vozila` (
`id` int(11) NOT NULL,
`make` varchar(50) COLLATE utf8_bin NOT NULL,
`model` varchar(50) COLLATE utf8_bin NOT NULL,
`godina` int(50) NOT NULL,
`boja` varchar(50) COLLATE utf8_bin NOT NULL,
`vin` varchar(50) COLLATE utf8_bin NOT NULL,
`engine` varchar(50) COLLATE utf8_bin NOT NULL,
`tip` varchar(50) COLLATE utf8_bin NOT NULL,
`vlasnik` varchar(50) COLLATE utf8_bin NOT NULL,
`regoz` varchar(50) COLLATE utf8_bin NOT NULL,
`istek` date NOT NULL,
`odometer` varchar(50) COLLATE utf8_bin NOT NULL,
`napomena` varchar(50) COLLATE utf8_bin NOT NULL,
`vlasnik_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
--
-- Indexes for table `accounts`
--
ALTER TABLE `accounts`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `vozila`
--
ALTER TABLE `vozila`
ADD PRIMARY KEY (`id`),
ADD KEY `vlasnik_id` (`vlasnik_id`);
如您所见,vlasnik_id
用作 INDEX,我正在尝试在 vlasnik_id
(作为参考)和 id 之间创建关系作为 FOREIGN KEY。
有人能告诉我我在 table 的创作方面做出了正确的决定吗?我是否为网络应用程序或其他目的添加了正确的密钥?
如果你创建了这个外键:
ALTER TABLE accounts ADD FOREIGN KEY (id) REFERENCES vozila (vlasnik_id);
根据您的设置,创建该约束确实成功。
但是有两个问题
第一个问题:每个账号只能拥有一辆车。每个帐户仅存储在一行中,其 id
具有单个值。如果 id
必须引用 vozila
中的一行,那么它只能引用一辆车。我觉得应该允许一个账号拥有多辆汽车的可能性更大
第二个问题:必须先插入具有引用值的行,然后才能插入引用它的行。换句话说,您必须先插入到 vozila
,所有者的值在 vlasnik_id
,然后才能将行插入到 accounts
和 id
。这似乎倒退了。
如果你这样定义外键,两个问题都解决了:
ALTER TABLE vozila ADD FOREIGN KEY (vlasnik_id) REFERENCES account(id);
您首先创建一个帐户,然后插入一辆或多辆引用该车主 id
的汽车。一个账号可以拥有多辆汽车。