在 PostgreSQL 中的现有表上创建主键?

虽然很少见,但您可能会遇到需要在现有表上定义主键的情况。这可以使用 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最大标记入境时间
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

这正如预期的那样。PRIMARY KEY 不能有重复的值。现在,让我们尝试在 (name, roll_no) 对上设置 PRIMARY KEY。

ALTER TABLE marks ADD PRIMARY KEY (name, roll_no)

这将起作用,因为 (name, roll_no) 的组合不重复。