【问题标题】:SQL - SET DEFAULT doesn't work when deleting a valueSQL - 删除值时 SET DEFAULT 不起作用
【发布时间】:2015-02-28 18:19:13
【问题描述】:

我有 2 张桌子:

CREATE TABLE REP
(
      PRIMARY KEY REP_NUM CHAR(2) DEFAULT ('00'),
      LAST_NAME CHAR(15),
      FIRST_NAME CHAR(15),
      STREET CHAR(15),
      CITY CHAR(15),
      PROVINCE CHAR(3),
      ZIP CHAR(5),
      COMMISSION DECIMAL(7,2),
      RATE DECIMAL(3,2) 
);

还有:

CREATE TABLE CUSTOMER
(
    CUSTOMER_NUM CHAR(3) PRIMARY KEY,
    FOREIGN KEY (REP_NUM) REFERENCES REP ON DELETE SET DEFAULT,
    CUSTOMER_NAME CHAR(35) NOT NULL,
    STREET CHAR(15),
    CITY CHAR(15),
    PROVINCE CHAR(3),
    ZIP CHAR(5),
    BALANCE DECIMAL(8,2),
    CREDIT_LIMIT DECIMAL(8,2),
    REP_NUM CHAR(2) 
);

如您所见,REP_NUM 列是REP 表中的主键和CUSTOMER 表中的外键。

例如,如果我在REP 表中输入新值,REP_NUM 的值为 35,同时在CUSTOMER 表中插入新值,REP_NUM 为 35,然后我将其删除来自REP 表:

DELETE FROM REP WHERE REP_NUM = '35';

我希望 CUSTOMER 表(外键)中的 REP_NUM 值现在为 00。

但是,当我运行此代码时,它不起作用。当我删除“35”时,我没有得到“00”,而是在CUSTOMER 表的REP_NUM 属性中得到一个“空白值”。

有什么建议吗?

谢谢!

【问题讨论】:

  • 我没有看到在客户表中设置任何默认值。此外,我认为在这种情况下触发器是最好的选择。
  • 我是否也需要在该表中设置默认值?我试过了,它给了我一个错误。它是为我的一门课程分配的,我们还没有涵盖触发器,所以我想我们不希望使用它
  • SET DEFAULT 表示在其他表中使用 那些列 的默认值,而不是 引用 列的默认值。
  • @Gambit2007:您需要将DEFAULT('00') 放在您定义 REP_NUM 的位置 - 而不是您定义外键的位置!
  • @Gambit2007: 是的 - 它不起作用,因为您将 DEFAULT('00') 添加到 FOREIGN KEY 定义中 - NOT 实际的列定义。尝试在表创建脚本的最后使用REP_NUM CHAR(2) DEFAULT('00')

标签: sql postgresql default


【解决方案1】:

您有几个问题: 代表表:

  • 主键的默认值没有意义,它会在第二次失败 使用时间

客户表

  • 您在 REP_NUM 上没有默认值,这是您在本主题中的主要问题
  • 您的外键引用表 REP,但在哪一列上?

两个表:

  • 使用缩写“数字”的 CHAR() 字段没有意义。 CHAR(2) 的选项数量也非常有限。

这个有效:

CREATE TABLE REP
(
      REP_NUM CHAR(2) PRIMARY KEY -- No default, doesn't make sence, it will FAIL the 2nd time you use it.
    -- other columns
);

CREATE TABLE CUSTOMER
(
    CUSTOMER_NUM CHAR(3) PRIMARY KEY,
    FOREIGN KEY (REP_NUM) REFERENCES REP(REP_NUM) ON DELETE SET DEFAULT, -- mention the column as well!
    REP_NUM CHAR(2) DEFAULT '00'
    -- other columns
);

INSERT INTO rep(rep_num) VALUES('00');
INSERT INTO rep(rep_num) VALUES('35');

INSERT INTO customer(CUSTOMER_NUM, rep_num) VALUES('x', default); -- results in 'a'
INSERT INTO customer(CUSTOMER_NUM, rep_num) VALUES('y', '35');

DELETE FROM rep WHERE rep_num = '35';

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 2011-06-11
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多