【问题标题】:How to delete from a Table without having to drop a constraint如何从表中删除而不必删除约束
【发布时间】:2019-05-17 10:17:23
【问题描述】:

我有一个问题,我需要在不删除或暂停约束的情况下删除信息。如果允许放弃约束,问题很简单。但是,我可以将值从 NULL 更改为 NOT NULL。

DELETE FROM SUPPLIER
WHERE COUNTRY = 'USA';

但是,另一个表 PRODUCT 是 SUPPLIER 中 SUPPLIER_NAME 列的外键。我不允许放弃这个约束。

我尝试将外键设置为空,但它不起作用。

编辑我不允许限制或暂停约束

这是完整的问题

“从数据库中删除有关位于美国的所有供应商的信息。有关位于美国的供应商提供的所有产品的信息必须保留在数据库中。您不得删除和/或暂停任何参考完整性约束,并且您必须修改 NULL/NOT NULL 一致性约束之一。"

正在使用的表

CREATE TABLE PRODUCT
(
    PRODUCT_NAME    VARCHAR(40)     NOT NULL,
    SUPPLIER_NAME   VARCHAR(40)     NOT NULL,
    CATEGORY_NAME   VARCHAR(30) NOT NULL,
    QUANTITY_PER_UNIT   VARCHAR(20),
    UNIT_PRICE      DECIMAL(10,2)   NOT NULL    DEFAULT 0,
    UNITS_IN_STOCK  DECIMAL(9)  NOT NULL    DEFAULT 0,
    UNITS_ON_ORDER  DECIMAL(9)  NOT NULL    DEFAULT 0, 
    REORDER_LEVEL   DECIMAL(9)  NOT NULL    DEFAULT 0,
    DISCONTINUED    CHAR(1)     NOT NULL    DEFAULT 'N',
    CONSTRAINT PK_PRODUCT PRIMARY KEY (PRODUCT_NAME),
    CONSTRAINT FK_CATEGORY_NAME FOREIGN KEY (CATEGORY_NAME) REFERENCES CATEGORY(CATEGORY_NAME),
    CONSTRAINT FK_SUPPLIER_NAME FOREIGN KEY (SUPPLIER_NAME) REFERENCES SUPPLIER(COMPANY_NAME),
    CONSTRAINT CK_PRODUCT_UNIT_PRICE CHECK (UNIT_PRICE >= 0),
    CONSTRAINT CK_PRODUCT_UNITS_IN_STOCK CHECK (UNITS_IN_STOCK >= 0),
    CONSTRAINT CK_PRODUCT_UNITS_ON_ORDER CHECK (UNITS_ON_ORDER >= 0),
    CONSTRAINT CK_PRODUCT_REORDER_LEVEL CHECK (REORDER_LEVEL >= 0),
    CONSTRAINT CK_PRODUCT_DISCONTINUED CHECK (DISCONTINUED in ('Y','N'))
);

CREATE TABLE SUPPLIER
(
    COMPANY_NAME    VARCHAR(40) NOT NULL,
    CONTACT_NAME    VARCHAR(30),
    CONTACT_TITLE   VARCHAR(30),
    ADDRESS         VARCHAR(60),
    CITY        VARCHAR(15),
    REGION      VARCHAR(15),
    POSTAL_CODE     VARCHAR(10),
    COUNTRY         VARCHAR(15),
    PHONE       VARCHAR(24),
    FAX         VARCHAR(24),
    HOME_PAGE       VARCHAR(500),
    CONSTRAINT PK_SUPPLIER PRIMARY KEY (COMPANY_NAME)  
);

【问题讨论】:

    标签: mysql


    【解决方案1】:

    由于 PRODUCT 表的外键未指定 ON DELETE 操作,因此它将具有默认行为 RESTRICT。由于您无法将此约束更新为 SET NULL,因此您可能必须自己将它们设置为 NULL。

    首先,修改表,使 SUPPLIER_NAME 外键可以接受 NULL 值。

    然后,更新其供应商在美国的 PRODUCTS,将其 SUPPLIER_NAME 设置为 NULL。像这样的:

    update PRODUCT set SUPPLIER_NAME = NULL where SUPPLIER_NAME IN (
    select SUPPLIER_NAME from SUPPLIER where COUNTRY = 'USA');
    

    最后您可以删除 COUNTRY = 'USA' 的 SUPPLIERS。

    【讨论】:

    • 其实我认为还有一件事。 “从数据库中删除有关位于美国的所有供应商的信息”我只是从表供应商中删除吗?
    • 是的。供应商信息仅存储在那里(根据您显示的内容)。
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2010-12-25
    • 2021-02-04
    • 1970-01-01
    • 2012-12-16
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多