正如标题所说。我检查了一些stackoverflow响应并尝试实现他们的解决方案,但仍然得到错误1452。
我抓住了bug report
并将其应用于我的数据库。
DROP TABLE IF EXISTS Countries;
CREATE TABLE IF NOT EXISTS Countries (
id int(11) NOT NULL,# AUTO_INCREMENT,
sortname varchar(3) NOT NULL,
name varchar(150) NOT NULL,
phonecode int(11) NOT NULL,
PRIMARY KEY (id)
);
DROP Table if EXISTS States;
CREATE TABLE IF NOT EXISTS States (
id int(11) NOT NULL,
name varchar(150) NOT NULL,
countryId int(11) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (countryId) REFERENCES Countries(id)
);
DROP TABLE IF EXISTS Cities;
CREATE TABLE IF NOT EXISTS Cities (
id int(11) NOT NULL,
name varchar(150) NOT NULL,
stateId int(11) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (stateId) references States (id)
);
我的插页:
INSERT INTO Countries (`id`, `sortname`, `name`, `phonecode`) VALUES
(1, 'AF', 'Afghanistan', 93),
(2, 'AL', 'Albania', 355),
(3, 'DZ', 'Algeria', 213),
(4, 'AS', 'American Samoa', 1684),
(5, 'AD', 'Andorra', 376),
...
#TRUNCATE TABLE States;
INSERT INTO States(`id`, `name`, `countryId`) VALUES
(1, 'Andaman and Nicobar Islands', 101),
(2, 'Andhra Pradesh', 101),
(3, 'Arunachal Pradesh', 101),
(4, 'Assam', 101),
(5, 'Bihar', 101),
...
#TRUNCATE TABLE Cities;
INSERT INTO Cities (`id`, `name`, `stateId`) VALUES
(1, 'Bombuflat', 1),
(2, 'Garacharma', 1),
(3, 'Port Blair', 1),
(4, 'Rangat', 1),
(5, 'Addanki', 2),
...
);
我对错误的看法是,最初,创建表是自动递增的,但创建/复制数据库的人仍然会插入id,我认为这不是必需的。所以在尝试了几件事后我删除了自动增量。不幸的是,没有决心。我想的另一件事是,外键(ID)可能与父表不匹配?但是,当我做一个简单的选择语句,如
Select * from States where id = 673; # 'Quebec'
我得到了正确的答复。解决这类问题的正确方法是什么?
编辑:当然我没有外键(通过直接复制他的存储库)让它工作但我认为这不是正确的方法。我认为外键是必要的。
Edit2:在原始sql脚本中添加了外键:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
CREATE TABLE IF NOT EXISTS `states` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`country_id` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
FOREIGN KEY (`country_id`) REFERENCES Countries(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4121 ;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
这使它成功,我不明白为什么:(