利用约束在sql中创建新表

时间:2018-11-08 01:51:26

标签: sql oracle

我正在尝试根据以下信息创建查询。尝试创建它时,我一直违反主键。

CREATE TABLE writers
    (authorid VARCHAR2(4), 
    lname VARCHAR2(10), 
    fname VARCHAR2(10), 
    isbn VARCHAR2(10), 
    title VARCHAR2(30) CONSTRAINT title_nn NOT NULL,
    CONSTRAINT wt_pk PRIMARY KEY (authorid),
    CONSTRAINT wt_fk FOREIGN KEY (isbn) REFERENCES books (isbn)); 
INSERT INTO writers 
(SELECT authorid, fname, lname, isbn, title
     FROM author
     JOIN bookauthor USING (authorid)
     JOIN books USING (isbn));
ALTER TABLE employees
ADD CONSTRAINT et_pk
PRIMARY KEY (ssn);

1 个答案:

答案 0 :(得分:1)

您尝试解决的最重要信息是:请勿复制这些表中的数据

在数据库架构中,您拥有表bookauthor,该表表示bookauthor表之间的多对多关系。每个作者可以写多本书,在这种情况下,用于填充 writers 表的语句对于同一authorid返回多行。这将导致您在批量插入过程中违反主键。

您可以通过稍微更改查询以找到authorid并在结果中包含多行来进行检查

SELECT authorid, count(1)
     FROM author
     JOIN bookauthor USING (authorid)
     JOIN books USING (isbn)
GROUP BY authorid
HAVING COUNT(1) > 1;
将主键设置为writers

authorid 表不是很有用,因此,在本练习中您不应该尝试填充它。