我是MySQL的初学者,刚刚开始使用外键和INNER JOIN
运算符。
所以我做了几张表:
CREATE TABLE `models`
(
`id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR (255) NOT NULL,
`price` MEDIUMINT UNSIGNED NOT NULL,
PRIMARY KEY( `id` )
);
CREATE TABLE `vendors`
(
`id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR (255) NOT NULL,
`id_model` TINYINT UNSIGNED NOT NULL,
PRIMARY KEY( `id` ),
FOREIGN KEY (`id_model`) REFERENCES models(`id`)
);
CREATE TABLE `cars`
(
`serial_number` MEDIUMINT UNSIGNED NOT NULL,
`id_vendor` TINYINT UNSIGNED NOT NULL,
FOREIGN KEY (`id_vendor`) REFERENCES vendors(`id`),
PRIMARY KEY( `serial_number` )
);
我知道如何获得输出。但是,问题是我不知道如何正确插入数据。我所能做的就是按表插入数据表。但是如何在一个查询中做到这一点,如果我插入Honda Civic并且已经拥有Honda Accord,那么它不会在数据库中复制本田供应商吗?
答案 0 :(得分:1)
似乎数据库的结构并不真正连贯。也许我不明白你想要做什么,但是......无论如何,这里也是。
假设你想要做的是在一个正确的normalized relational database,正确{{3}}中存储汽车列表,你想要做的就是思考现实生活中发生的事情":
考虑到这一点,您的表结构是:
Vendors
- id
- name
Models
- id
- name
- vendor ( foreign key => vendor.id )
Cars
- id
- serial_number
- model ( foreign key => model.id )
您不需要在汽车表中引用供应商,因为您有对模型的引用,而模型又引用了供应商。
插入时,您可以逐个,确保外键条目已存在。
所以本田Civic / Accord的情况并不与本田重复。表格应该是这样的:
Vendor
id, name
1, "Honda"
Model
id, name, vendor
1, "Civic", 1
2, "Accord", 1
Cars
id, serial_no, model
1, "A serial", 2 -> a honda accord
2, "Another serial", 1 -> a honda civic
希望这有所帮助。
答案 1 :(得分:0)
您需要检查自己是否存在重复记录。
IF EXISTS (SELECT * FROM vendors WHERE Name = 'Honda')
BEGIN
-- Insert into cars with existing vendor id
END
ELSE
BEGIN
IF EXISTIS (SELECT * FROM models WHERE Name = 'your model name')
BEGIN
-- insert into vendors with existing model id
END
ELSE
BEGIN
-- insert into models
-- insert into vendors
-- insert into cars
END
END
您可以为其创建存储过程,并将汽车,供应商和模型作为参数传递。 或者你可以先列出模型,插入它们;然后是所有供应商和所有汽车。只是一个愚蠢的答案。欢迎使用更复杂的解决方案。