【问题标题】:How do you correctly format a new table that is pulling from another table while creating constraints in SQL在 SQL 中创建约束时,如何正确格式化从另一个表中提取的新表
【发布时间】:2019-03-10 04:03:02
【问题描述】:

下面我创建了一个包含主键、外键、非空约束的表,但是我一直收到错误

“%s:无效的标识符”

创建表编写器 (((authorid VARCHAR2(4), 姓 VARCHAR2(10), 名字 VARCHAR2(10), isbn VARCHAR2(10), 标题 VARCHAR2(30)),
(CONSTRAINT wt_pk PRIMARY KEY (authorid), 约束 wt_nn NOT NULL(标题), CONSTRAINT wt_fk FOREIGN KEY (isbn) REFERENCES books (isbn)));

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    首先创建表然后尝试插入到选择中。

    CREATE TABLE writers
    (
        authorid <datatype>, 
        last name <datatype>, 
        first name <datatype>, 
        isbn <datatype>, 
        title <datatype>,  
        CONSTRAINT wt_pk PRIMARY KEY (authorid),
        CONSTRAINT wt_nn NOT NULL (title),
        CONSTRAINT wt_fk FOREIGN KEY (isbn) REFERENCES books (isbn)
    ) ;
    
    insert into writers (authorid, last name, first name, isbn, title)
    SELECT authorid, fname, lname, isbn, title 
         FROM author 
         JOIN bookauthor USING (authorid)
         JOIN books USING (isbn);
    

    【讨论】:

    • 我用您推荐的内容更新了我的原始帖子,但我仍然收到无效标识符 @AmeyaN99
    • CREATE TABLE writers (authorid VARCHAR2(4), lastname VARCHAR2(10), firstname VARCHAR2(10), isbn VARCHAR2(10), title VARCHAR2(30), CONSTRAINT wt_pk PRIMARY KEY (authorid), CONSTRAINT wt_nn NOT NULL (title), CONSTRAINT wt_fk FOREIGN KEY (isbn) REFERENCES books (isbn));
    【解决方案2】:

    Oracle 不允许您使用as 指定表定义。所以,先创建表,再添加约束:

    CREATE TABLE writers as
        SELECT authorid, fname, lname, isbn, title
        FROM author JOIN
             bookauthor
             USING (authorid) JOIN
             books
             USING (isbn);
    
    ALTER TABLE writers
        ADD CONSTRAINT wt_pk PRIMARY KEY (authorid);
    ALTER TABLE writers
        ADD CONSTRAINT wt_nn NOT NULL (title);
    ALTER TABLE writers
        ADD CONSTRAINT wt_fk FOREIGN KEY (isbn) REFERENCES books (isbn);
    

    据推测,您实际上希望主键约束在 (authorid, isbn) 而不仅仅是 authorid

    【讨论】:

    • 当我在创建表后添加约束时,我会收到“无效的 ALTER TABLE 选项”
    • @Mitch 。 . .一些数据库允许在alter table 中进行多次更改,但 Oracle 不是其中之一。那应该是三个单独的语句。
    • 使用这种方法我违反了主键约束,因为我在数据表中有重复项:无法验证 (%s.%s) - 违反了主键" *原因:尝试使用重复值或空值。*操作:在启用主键之前删除重复值和空值。
    • @Mitch 。 . .好吧,如果数据不符合要求,那么您就不需要这些约束。这大概是主键约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2023-01-20
    • 2022-01-21
    • 1970-01-01
    • 2021-06-11
    • 2013-05-21
    • 2021-03-15
    相关资源
    最近更新 更多