Database design 在一行中输入多个主键或值

Database design 在一行中输入多个主键或值,database-design,Database Design,我是SQL新手,正在尝试每行存储3个值。 第一列是服务器ID,第二列是名称,第三列是不同的ID。 第一个ID和名称保持不变,但第二个ID可能会更改。所以我想在重复键上使用INSERT INTO table。但是如果第一列和第二列是重复的,我希望它更新。因为我将有多个具有相同第一个ID的行: ID | Name | ID 2 -------------------------------------------------- 123

我是SQL新手,正在尝试每行存储3个值。 第一列是服务器ID,第二列是名称,第三列是不同的ID。 第一个ID和名称保持不变,但第二个ID可能会更改。所以我想在重复键上使用INSERT INTO table。但是如果第一列和第二列是重复的,我希望它更新。因为我将有多个具有相同第一个ID的行:

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,则可以使用此索引查找属于它的名称。

一个表中永远不能有两个主键。