虽然很少见,但您可能会遇到需要在现有表上定义主键的情况。这可以使用 ALTER TABLE 语句来实现。
语法是 -
ALTER TABLE table_name ADD PRIMARY KEY (column_name1, column_name2,…., columns_nameN)
从上面的语法可以看出,可以在多列上定义PRIMARY KEY。当您在多个列上定义了 PRIMARY KEY 时,条件是列对应该具有唯一且非空的值。因此,如果在 (column1, column2) 上定义了 PRIMARY KEY,则允许值 (value1, value2)、(value3, value2) 和 (value1,value4)。即使 column1 重复了 value1 并且 column2 重复了 value2,但当一起考虑时,这对列具有唯一值。
让我们考虑一个例子来理解这一点。让我们创建一个表格标记并按如下方式填充它 -
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 * frommarks2),您将看到类似于以下内容的输出 -
名称 | roll_no | 获得分数 | perc_marks | 最大标记 | 入境时间 |
---|---|---|---|---|---|
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
这正如预期的那样。PRIMARY KEY 不能有重复的值。现在,让我们尝试在 (name, roll_no) 对上设置 PRIMARY KEY。
ALTER TABLE marks ADD PRIMARY KEY (name, roll_no)
这将起作用,因为 (name, roll_no) 的组合不重复。