连续多个主键或值?

问题描述 投票:0回答:2

我每行存储三个值:服务器 ID、名称和不同的 ID。第一个 ID 和名称保持不变,但第二个 ID 可能会更改。所以我想用

INSERT INTO table ON DUPLICATE KEY
。但如果第一列和第二列重复,我希望它更新,因为我将有多行具有相同的第一个 ID。

身份证 姓名 ID 2
123 姓名1 23425
123 名称2 125623
123 名称3 4425252
098 姓名1 4354356

每个服务器都会有多个条目(因此第一个ID保持不变);每个条目代表一个具有名称和 ID 的对象。每个服务器都有相同的对象,但具有不同的 ID。因此 name1 也出现在 ID 098 中,依此类推。我应该如何创建我的表格?

我希望服务器 ID 和名称作为两个组合主键,合而为一。因此,如果服务器位于表和对象(名称)中,则应该更新而不是插入。我正在考虑两个主键或一个主键和多个值,因此每个服务器 id 都有一个包含名称和 id 的对象列表。

database-design mariadb
2个回答
2
投票

不,这不是你想要的。 您想要两张桌子:

create table ids as (
    id int,
    name varchar(255)
);

create table id_pairs as (
    id int,
    id2 int,
    id references ids(id)
);

然后您可以使用

id
查找
JOIN
的名称。

这个过程称为标准化。 一般来说,您希望设置数据库,这样就不会在多个位置存储相同的数据。 具有

id
/
name
的多行只会导致数据完整性问题。


0
投票

您可以创建一个像这样的表:

CREATE TABLE `table` (
   ID int,
   Name varchar(255),
   ID2 int,
   PRIMARY KEY (ID, Name));

这样前两个字段(ID 和名称)是唯一的。

因为您还希望 Name 和 ID2 是唯一的,所以您可以创建另一个索引:

CREATE UNIQUE INDEX `idx_table` ON `table`(Name, ID2);

但也许最好像这样创建这个额外的索引:

CREATE UNIQUE INDEX `idx_table` ON `table`(ID2, Name);

不同的是,如果你只知道

ID2
,这个索引可以用来找到属于它的
Name

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.