使用外键插入数据并避免重复

时间:2014-05-10 15:59:19

标签: mysql sql foreign-keys

我是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,那么它不会在数据库中复制本田供应商吗?

2 个答案:

答案 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 )

您不需要在汽车表中引用供应商,因为您有对模型的引用,而模型又引用了供应商。

插入时,您可以逐个,确保外键条目已存在。

  • 插入汽车对象时,只需提供型号ID。
  • 插入模型对象时,需要提供供应商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

您可以为其创建存储过程,并将汽车,供应商和模型作为参数传递。 或者你可以先列出模型,插入它们;然后是所有供应商和所有汽车。只是一个愚蠢的答案。欢迎使用更复杂的解决方案。

相关问题