我在尝试创建这两个表之间的关系时遇到了此问题:vozila和帐户
完整错误:
# 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`))
我知道有些人已经问过这个问题了,但是通过看他们的表格和答案,我不知道这个问题如何适合我的情况,这就是为什么我提出这个问题。
- 我想达到什么目的?
因为我想创建一个Web应用程序,用它来显示有关车辆的信息(来自汽车表),但当然我只想显示分配给特定用户的车辆,而不是所有车辆。
何时发生此错误?
当我尝试在表(vozila和帐户)之间创建关系时,出现了我遇到的错误。
下面是用于创建这两个表的代码:
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;
而对于沃齐拉
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(作为外键)之间创建关系。
有人能告诉我是否做出了与表创建相关的正确决定,以及我是否为Web应用程序或其他目的添加了正确的键吗?
1条答案
按热度按时间sycxhyv71#
如果您创建了此外键:
根据您的设置,创建该约束确实会成功。
但有两个问题。
第一个问题:每个帐户只能是一辆汽车的所有者。每个帐户只存储在一行中,并且它的
id
只有一个值。如果该id
必须引用vozila
中的一行,则它只能引用一辆汽车。我认为更有可能的情况是,一个帐户应该被允许是多辆汽车的所有者。第二个问题:必须先插入具有被引用值的行,然后才能插入引用该行的行。换句话说,必须先插入
vozila
,其中所有者的值在vlasnik_id
中,然后才能将行插入accounts
,其中包含id
。这似乎是倒退。如果按以下方式定义外键,则两个问题都可以解决:
首先创建一个帐户,然后插入一辆或多辆引用该车主的
id
的汽车。该帐户可以拥有多辆汽车。