SQL - 数据库引用

  • 本文关键字:引用 数据库 SQL sql
  • 更新时间 :
  • 英文 :


销售表:

id | product_id | year | quantity | price
---+------------+------+----------+-------
1 |        100 | 2008 |       10 |  5000
2 |        100 | 2008 |       10 |  5000
3 |        200 | 2011 |       15 |  9000

产品表:

id | product_name | product_id
---+--------------+------------
1 | Nokia        |        100
2 | Apple        |        200
3 | Samsung      |        200

在这两个表中,我引用了"销售"表和"产品">表,如下所示:

CREATE TABLE Sales_table
(
id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL,
year INTEGER NOT NULL,
quantity INTEGER NOT NULL,
price INTEGER NOT NULL
);
CREATE TABLE Products_table
(
id SERIAL PRIMARY KEY,
product_name VARCHAR NOT NULL,
product_id INTEGER REFERENCES Sales_table
);

这两个表已成功创建,但是当我将数据插入Products_table时,出现错误

错误:在表"products_table"上插入或更新违反了外键约束"products_table_product_id_fkey">
详细信息:表 "sales_table" 中不存在键 (product_id(=(200(。

也就是说,引用的表不允许相同的"product_id"字段名称意味着,那么为什么Products_table表是使用 REFERENCES 创建的Sales_table呢?

您的外键引用是向后的。 你想要:

CREATE TABLE Products_table (
id SERIAL PRIMARY KEY,
product_name VARCHAR NOT NULL
);
CREATE TABLE Sales_table (
id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL,
year INTEGER NOT NULL,
quantity INTEGER NOT NULL,
price INTEGER NOT NULL,
product_id INTEGER REFERENCES product_table (id)
);

我实际上建议在表之后命名主键 - 以便主键和外键列名称匹配(即JOINUSING是有道理的(。 此外,在较新版本的Postgres中,generated always as identity优于serial。 所以:

CREATE TABLE Products_table (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_name VARCHAR NOT NULL
);
CREATE TABLE Sales_table (
sale_id GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_id INTEGER NOT NULL,
year INTEGER NOT NULL,
quantity INTEGER NOT NULL,
price INTEGER NOT NULL,
product_id INTEGER REFERENCES products_table (product_id)
);

最新更新