主键重复输入

时间:2019-05-17 00:09:22

标签: mysql

给出的任务是:

  

创建一个新的关系表,以存储有关所有供应商的公司名称和每个供应商提供的产品总数的信息。在新表上强制执行适当的一致性约束。接下来,将有关所有供应商的公司名称和每个供应商提供的产品总数的信息复制到新表中。

我收到一个错误Duplicate Entry for key "PRIMARY",当我尝试运行此脚本时


     CREATE TABLE COMPANY_AND_SUPPLIERS (

        COMPANY_NAME VARCHAR (40) NOT NULL DEFAULT 'EMPTY',
        PRODUCT_NAME VARCHAR(40) NOT NULL DEFAULT 'EMPTY' ,
        TOTAL_PRODUCTS VARCHAR(40) NOT NULL DEFAULT 'EMPTY',
        CONSTRAINT SUPPLIER_PKEY PRIMARY KEY(COMPANY_NAME) ,
        CONSTRAINT SUPPLIER_FKEY FOREIGN KEY (COMPANY_NAME) REFERENCES SUPPLIER(COMPANY_NAME)


        );

    INSERT INTO COMPANY_AND_SUPPLIERS(COMPANY_NAME, PRODUCT_NAME)
    SELECT  DISTINCT SUPPLIER.COMPANY_NAME, PRODUCT.PRODUCT_NAME
    FROM SUPPLIER, PRODUCT;

    UPDATE COMPANY_AND_SUPPLIERS
    SET TOTAL_PRODUCTS = (SELECT COUNT(*) AS TOTALPRODUCTS
    FROM PRODUCT);

此练习的整个目的是复制所有供应商的公司名称以及每个供应商提供的产品总数。

赠送桌子

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)  
);

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'))
);

2 个答案:

答案 0 :(得分:0)

您的表格中不应包含产品名称,而只能包含公司名称和总产品数量。 PRODUCTS表中已经包含每种产品的供应商名称。因此,您只需要从该表中计算每个供应商的产品数量即可。

CREATE TABLE Company_Totals (
    Company_name VARCHAR(40) NOT NULL,
    Total_Products INT(11) NOT NULL,
    PRIMARY KEY (Company_name),
    FOREIGN KEY (Company_name) REFERENCES Supplier(Company_name)
);

INSERT INTO Company_Totals (Company_name, Total_Products)
SELECT SUPPLIER_NAME, COUNT(*)
FROM PRODUCT
GROUP BY SUPPLIER_NAME;

答案 1 :(得分:0)

company_name不应为primary key,因为primary key是唯一值。

以这个为例

如果数据库管理员创建的表以first_name作为主键,那将是一场灾难,因为有很多人以John为姓氏

这就是为什么大多数时候主键是整数,然后我们使用this方法使其唯一的原因。