在已有的PostgreSQL表中创建主键?


虽然很少见,但你可能会遇到需要在现有表上定义主键的情况。这可以使用ALTER TABLE语句实现。

语法如下:

ALTER TABLE table_name ADD PRIMARY KEY (column_name1,
column_name2,…., columns_nameN)

从上面的语法可以看出,你可以在多个列上定义主键。当你在多个列上定义主键时,条件是列对应该具有唯一且非空的值。因此,如果主键定义在(column1, column2)上,则允许值(value1, value2)、(value3, value2)和(value1, value4)。即使column1的值value1重复,column2的值value2重复,但当将列对一起考虑时,它们的值是唯一的。

让我们考虑一个例子来理解这一点。让我们创建一个名为marks的表并填充它,如下所示:

CREATE TABLE marks(
   name VARCHAR,
   roll_no INTEGER,
   marks_obtained INTEGER,
   perc_marks DOUBLE PRECISION,
   max_marks INTEGER,
   date_of_entry DATE
);
INSERT INTO marks(name, roll_no, marks_obtained, perc_marks,
max_marks, date_of_entry)
VALUES ('Yash', 26, 42, 42.0, 100, current_date),
('Isha', 56, 175, 87.5, 200, current_date),
('Yash', 35, 12, 24, 50, current_date);

如果你查询该表(SELECT * from marks2),你会看到类似于以下的输出:

姓名学号获得分数百分比分数满分录入日期
Yash2642421002021-01-31
Isha5617587.52002021-01-31
Yash351224502021-01-31

这个表目前还没有设置主键。现在,让我们尝试将name列定义为主键。

ALTER TABLE marks ADD PRIMARY KEY (name)

PostgreSQL将返回一个错误:

ERROR: could not create unique index "marks_pkey" DETAIL: Key (name)=(Yash) is
duplicated. SQL state: 23505

这是预期的。主键不能有重复的值。现在,让我们尝试在(name, roll_no)对上设置主键。

ALTER TABLE marks ADD PRIMARY KEY (name, roll_no)

这将有效,因为没有(name, roll_no)组合是重复的。

更新于:2021年2月2日

2K+ 浏览量

启动你的职业生涯

完成课程获得认证

开始学习
广告