我每行存储三个值:服务器 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 的对象列表。
不,这不是你想要的。 您想要两张桌子:
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
的多行只会导致数据完整性问题。
您可以创建一个像这样的表:
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
。