📜  postgresql 继承 - SQL (1)

📅  最后修改于: 2023-12-03 15:33:45.680000             🧑  作者: Mango

PostgreSQL 继承 - SQL

在 PostgreSQL 中,可以使用继承机制来创建具有继承关系的表。这对于拥有类似模式的表非常有用,并且可以减少重复的代码和结构。

创建父表

我们首先要创建一个“父表”,它将包含共享的列和结构。

CREATE TABLE employees (
  employee_id serial PRIMARY KEY,
  first_name VARCHAR (50) NOT NULL,
  last_name VARCHAR (50) NOT NULL,
  hire_date DATE NOT NULL
);

在上面的代码中,我们创建一个名为“employees”的表,它包含四列:employee_id、first_name、last_name和hire_date。employee_id 是一个 SERIAL 类型的主键,它将自动递增。

创建子表

接下来,我们将创建两个子表,它们将继承 employees 的结构:

CREATE TABLE full_time_employees (
  salary NUMERIC(10,2) NOT NULL,
  CONSTRAINT full_time_employees_pkey PRIMARY KEY (employee_id)
) INHERITS (employees);

CREATE TABLE part_time_employees (
  hourly_rate NUMERIC(10,2) NOT NULL,
  CONSTRAINT part_time_employees_pkey PRIMARY KEY (employee_id)
) INHERITS (employees);

在上面的代码中,我们分别创建了两个表:full_time_employees 和 part_time_employees。这两个表都包含一个名为 employee_id 的主键,它继承自 employees 表。因此,如果我们查询 full_time_employees 或 part_time_employees 表中的 employee_id 列,将会同时返回 employees 表中的 employee_id 列。

此外,我们还添加了一个 salary 列和一个 hourly_rate 列,以示区别。这些列是具体表的特定列,并不是继承自父表的列。

插入数据

现在,我们可以向 full_time_employees 和 part_time_employees 表中插入数据了,当我们查询这些表的时候,我们会看到所有继承自 employees 表的列都会被返回:

INSERT INTO employees (first_name, last_name, hire_date)
VALUES ('John', 'Doe', '2018-01-01');

INSERT INTO full_time_employees (employee_id, salary)
VALUES (1, 50000.00);

INSERT INTO part_time_employees (employee_id, hourly_rate)
VALUES (1, 25.00);

SELECT * FROM employees;
-- 1, John, Doe, 2018-01-01

SELECT * FROM full_time_employees;
-- 1, John, Doe, 2018-01-01, 50000.00

SELECT * FROM part_time_employees;
-- 1, John, Doe, 2018-01-01, 25.00

在上面的代码中,我们首先向 employees 表中插入了一行数据。然后,我们向 full_time_employees 表和 part_time_employees 表中插入了相同的 employee_id,但是分别添加了 salary 和 hourly_rate。

当我们查询这些表时,我们可以看到每个表都包含 employee_id、first_name、last_name 和 hire_date 列。full_time_employees 表还包含了一个 salary 列,而 part_time_employees 表则包含了一个 hourly_rate 列。

注意事项

需要注意的是,当使用继承时,如果您想在继承子表中插入一些特定的值,而这些值对父表没有意义时,子表中需要有对应列。在上面的例子中,我们必须在 full_time_employees 和 part_time_employees 表中添加 employee_id 列,以便在这些表中插入员工的工资数据。

此外,如果您要查询多个继承子表中的数据,请使用 UNION ALL 而不是 UNION。这是因为 UNION 只会返回唯一的行,而 UNION ALL 可以返回所有的行。

总结

在本文中,我们介绍了 PostgreSQL 中继承的概念和使用方法。我们创建了一个“父表”,然后创建了两个继承自该表的“子表”。我们还演示了如何插入数据并查询继承子表中的数据。

这种表继承机制使得构建具有类似结构的表非常方便,同时还能减少重复的代码和结构。