在已有的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),你会看到类似于以下的输出:
姓名 | 学号 | 获得分数 | 百分比分数 | 满分 | 录入日期 |
---|---|---|---|---|---|
Yash | 26 | 42 | 42 | 100 | 2021-01-31 |
Isha | 56 | 175 | 87.5 | 200 | 2021-01-31 |
Yash | 35 | 12 | 24 | 50 | 2021-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)组合是重复的。
广告