【问题标题】:Is possible to create a foreign key without a primary key?可以在没有主键的情况下创建外键吗?
【发布时间】:2019-03-24 14:28:18
【问题描述】:

我正在创建两个表,我想在 customer_email 列上放置一个外键,知道它不是主键。

那么可以在没有主键的情况下创建外键吗?以及我如何使用 DATE()?

这是我的餐桌客户和订单:

CREATE TABLE customer(
customer_id INTEGER PRIMARY KEY NOT NULL,
customer_email VARCHAR(225)
customer_name VARCHAR(225)
customer_last_name VARCHAR(225)
);

CREATE TABLE order(
order_id INTEGER PRIMARY KEY NOT NULL
customer_email  VARCHAR(225) REFERENCES customer(customer_email)
product_1 DECIMAL(10,2)
product_2 DECIMAL(10,2)
product_3 DECIMAL(10,2)
product_4 DECIAML(10,2)
product_5 DECIAML(10,2)
order_date DATE()
);

【问题讨论】:

  • date()是一个函数,但是你需要定义一个数据类型为:order_date date的列
  • 请注意,您的 order 表未标准化,您应该有一个额外的表来存储单个订单中包含的产品,请阅读标准化(顺便说一句:order 是一个 真的一个表的名字不好,因为order是一个保留关键字,你必须使用双引号,"order"才能使用它)。
  • 是的...您在此处发布的代码甚至无法编译,请不要使用order 来命名您的表和列。
  • 我知道这个订单是个坏名字,但我就是这么想的……是否可以自动输入日期,所以输入当天的日期?因为如果我现在选择 (),请给我今天的日期。

标签: postgresql foreign-keys


【解决方案1】:

Postgres 的 documentation 用于创建外键解决您的问题:

最后,我们应该提到外键必须引用作为主键或形成唯一约束的列。如果外键引用了唯一约束,那么关于如何匹配空值还有一些额外的可能性。

因此,您当然可以在order 表中创建一个外键,该表引用customer 表中的customer_email,但必须对电子邮件字段进行唯一约束。因此,customer 表的以下定义应该有效:

CREATE TABLE customer (
    customer_id INTEGER PRIMARY KEY NOT NULL,
    customer_email VARCHAR(225),
    customer_name VARCHAR(225),
    customer_last_name VARCHAR(225),
    CONSTRAINT email_unique UNIQUE (customer_email)
);

【讨论】:

  • 谢谢。我可以把 DATE() 放在桌子上吗?
  • @Bruno 在您原来的问题下查看 Horse 的评论。
  • 谢谢,我都没注意到
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2011-07-23
  • 2015-06-05
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多