Database design 在一行中输入多个主键或值
我是SQL新手,正在尝试每行存储3个值。 第一列是服务器ID,第二列是名称,第三列是不同的ID。 第一个ID和名称保持不变,但第二个ID可能会更改。所以我想在重复键上使用INSERT INTO table。但是如果第一列和第二列是重复的,我希望它更新。因为我将有多个具有相同第一个ID的行:Database design 在一行中输入多个主键或值,database-design,Database Design,我是SQL新手,正在尝试每行存储3个值。 第一列是服务器ID,第二列是名称,第三列是不同的ID。 第一个ID和名称保持不变,但第二个ID可能会更改。所以我想在重复键上使用INSERT INTO table。但是如果第一列和第二列是重复的,我希望它更新。因为我将有多个具有相同第一个ID的行: ID | Name | ID 2 -------------------------------------------------- 123
ID | Name | ID 2
--------------------------------------------------
123 | name1 | 23425
123 | name2 | 125623
123 | name3 | 4425252
098 | name1 | 4354356
....
我希望我能说清楚,每个服务器都有多个条目,因此第一个ID保持不变,这些条目代表一个对象。所述对象具有名称和ID。每个服务器具有相同的对象,但具有不同的ID。因此名称1也出现在ID 098中,以此类推
我应该如何创建我的表?我希望服务器id和名称作为两个组合主键,也就是说,它们的功能是一个。因此,如果服务器在表中,并且对象名在表中,则应该更新而不是插入。
如前所述,我考虑的是两个主键或一个主键和多个值。所以每个服务器id都有一个包含名称和id的对象列表。不,这不是您想要的。您想要两张桌子:
create table ids as (
id int,
name varchar(255)
);
create table id_pairs as (
id int,
id2 int,
id references ids(id)
);
然后,您可以使用连接查找id的名称
这个过程称为规范化。通常,您希望设置数据库,以便不在多个位置存储相同的数据。有多个id/name的行只会导致数据完整性问题。您可以创建如下表:
CREATE TABLE `table` (
ID int,
Name varchar(255),
ID2 int,
PRIMARY KEY (ID, Name));
CREATE UNIQUE INDEX `idx_table` ON `table`(ID2, Name);
这样,前两个字段ID和Name是唯一的
因为您还希望Name和ID2是唯一的,所以可以创建另一个索引:
CREATE UNIQUE INDEX `idx_table` ON `table`(Name, ID2);
但也许最好创建这样的额外索引:
CREATE TABLE `table` (
ID int,
Name varchar(255),
ID2 int,
PRIMARY KEY (ID, Name));
CREATE UNIQUE INDEX `idx_table` ON `table`(ID2, Name);
不同之处在于,如果您只知道ID2,则可以使用此索引查找属于它的名称。一个表中永远不能有两个主键。