如何在从另一个表中提取数据的同时创建带有约束的表

2023-12-10

我正在尝试创建一个作家表,其中包含作者 ID、姓氏、名字、ISBN 以及每位作者所写书籍的书名。虽然使用与作者和书籍表相同的数据类型,但不复制这些表中的数据。并将作者 ID 作为主键,标题不为空,ISBN 作为引用 books 表中 ISBN 的外键。但是我收到“违反唯一约束(WT_PK)”错误:

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

看来您需要为 WRITERS 表使用复合键。例子 (使用 Oracle 12c 和 11g、dbfiddle 进行测试here):

-- 4 authors
create table author ( authorid primary key, fname, lname )
as
select 1, 'fname_1', 'lname_1' from dual union all
select 2, 'fname_2', 'lname_2' from dual union all
select 3, 'fname_3', 'lname_3' from dual union all
select 4, 'fname_4', 'lname_4' from dual ;

-- 7 books
create table books ( isbn primary key, title )
as
select '978-1449324451', 'title_1' from dual union all
select '978-1449324452', 'title_2' from dual union all
select '978-1449324453', 'title_3' from dual union all
select '978-1449324454', 'title_1_4' from dual union all 
select '978-1449324455', 'title_2_4' from dual union all
select '978-1449324456', 'title_3_4' from dual union all
select '978-1449324457', 'title_4_4' from dual ;

-- suppose that 4 books are written by one and the same author
create table bookauthor( authorid, isbn )
as
select A.authorid, B.isbn
from author A 
  join books B on A.authorid = substr( B.title, length( B.title ), 1 ) ;

向 BOOKAUTHOR 表添加一些约束,并检查其内容:

-- authorid, isbn
alter table bookauthor 
add (
  constraint ba_fk1 foreign key( authorid ) references author( authorid )
, constraint ba_fk2 foreign key( isbn ) references books( isbn )
, constraint ba_pk primary key ( authorid, isbn )
) ;


SQL> select * from bookauthor;
  AUTHORID ISBN          
---------- --------------
         1 978-1449324451
         2 978-1449324452
         3 978-1449324453
         4 978-1449324454
         4 978-1449324455
         4 978-1449324456
         4 978-1449324457

“原始”DDL 代码(稍加修改)-> INSERT 失败

create table writers (
  authorid varchar2( 4 )
, lname varchar2( 10 )
, fname varchar2( 10 )
, isbn char( 14 )
, 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);
-- ORA-00001: unique constraint (...WT_PK) violated 
-- author 4 with 4 books!

建议的 DDL 代码(和测试):

create table writers2 (
  authorid varchar2( 4 )
, lname varchar2( 10 )
, fname varchar2( 10 )
, isbn char( 14 )
, title varchar2( 30 ) constraint title_nn2 not null
, constraint wt_pk2 primary key ( authorid, isbn )
, constraint wt_fk2 foreign key( isbn ) references books( isbn )
);

INSERT INTO writers2
SELECT authorid, fname, lname, isbn, title 
FROM author 
   JOIN bookauthor USING(authorid) 
   JOIN books USING(isbn);
-- 7 rows inserted.

从 WRITERS2 中选择:

SQL> select * from writers2 ;

AUTH LNAME      FNAME      ISBN           TITLE                         
---- ---------- ---------- -------------- ------------------------------
1    fname_1    lname_1    978-1449324451 title_1                       
2    fname_2    lname_2    978-1449324452 title_2                       
3    fname_3    lname_3    978-1449324453 title_3                       
4    fname_4    lname_4    978-1449324454 title_1_4                     
4    fname_4    lname_4    978-1449324455 title_2_4                     
4    fname_4    lname_4    978-1449324456 title_3_4                     
4    fname_4    lname_4    978-1449324457 title_4_4 

不过,不确定为什么需要 WRITERS 表 - 因为您可以通过运行查询来生成其数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在从另一个表中提取数据的同时创建带有约束的表 的相关文章

  • oracle中的区间函数

    Query SELECT INTERVAL 300 month INTERVAL 54 2 year to month INTERVAL 11 12 10 1234567 hour to second FROM DUAL 上述查询的输出是
  • 在 SQL Server SELECT 语句中使用 CASE 时消除 NULL

    我有一份大而混乱的报告要写 它连接了 5 个表 一个表中有一列用于多个不同的值 本质上是一个 标签 列 其中标签根据用户想要使用的各种元数据的类型以创造性的方式使用 因此 我对报告的查询返回 3 个几乎相同的行 仅 标签 列有所不同 例如
  • 优化 LINQ 查询 - 如何缩短执行时间?

    我想知道是否有一个好的方法来优化我的 LINQ 查询 我正在使用类似于以下内容的 LINQ 查询从数据库检索数据 PKs is a list of integers var import context table Where x gt P
  • Mysql 在给定日期时间范围内插入随机日期时间

    使用 SQL 我可以在给出范围的列中插入随机日期时间值吗 例如 给定一个范围2010 04 30 14 53 27 to 2012 04 30 14 53 27 我对范围部分感到困惑 因为我刚刚做了这个 INSERT INTO someta
  • 仅基于月份和年份的 SQL Server 日期比较

    我无法确定仅根据月份和年份比较 SQL 中的日期的最佳方法 我们根据日期进行计算 由于计费是按月进行的 因此该月的日期会造成更多障碍 例如 DECLARE date1 DATETIME CAST 6 15 2014 AS DATETIME
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • SQL Server 2008 中的 FREETEXT 查询不进行短语匹配

    我在 SQL Server 2008 中有一个全文索引表 我正在尝试使用 FULLTEXT 查询精确的短语匹配 我不认为使用 CONTAINS 或 LIKE 适合于此 因为在其他情况下查询可能不准确 用户没有用双引号括起短语 并且一般来说我
  • T-SQL 问题:查询 XML

    任何人都可以告诉我如何从这些数据生成 DATA Key ParentKey 5 NULL 25 5 33 25 26 5 27 5 34 27 28 5 29 5 这个 XML 结果 RESULTS
  • 使用输出在合并语句中设置变量

    我有一个合并语句应该始终更新或插入一条记录 我想记住变量中该语句的 ID 它看起来像这样 DECLARE int int MERGE dbo table AS A USING SELECT stringtomatch AS string A
  • 插入MYSQL时自动初始化GETDATE()

    类似问题 https stackoverflow com questions 17700239 mysql column automaticly current time of insert w3schools 也许有用的链接 http w
  • SSRS 报告 - IIF 声明问题

    做一个表达式时出现错误 有人可以在这里告诉我正确的语法吗 IIf Fields t cpcp Value 310 Purchased Material Raw Material Nothing IIf Fields t cpcp Value
  • 自定义 Sql Server 对象资源管理器右键单击菜单项

    如何在 Sql Server 2012 的对象资源管理器中添加或自定义右键菜单项 例如 我想将新项目添加到表右键菜单中以生成自定义表创建器脚本 您可以编写一个 SSMS 加载项 See http sqlblogcasts com blogs
  • JDBC元数据检索约束信息

    我需要来自约束名称的有关表和列名称的信息 是否存在类似于connection getMetadata getX的人来检索约束信息 我的测试用例在Oracle数据库中 但我最好的解决方案只是想用jdbc来解决 如果您正在谈论外键和主键约束 这
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • 在大表上快速使用 LIMIT 和 OFFSET 进行 SELECT

    我的表中有超过 1000 万条记录 SELECT FROM tbl ORDER BY datecol DESC LIMIT 10 OFFSET 999990 输出EXPLAIN ANALYZE on 解释 depesz com http e
  • 子查询在多项选择时返回超过 1 个值的 SQL 错误

    我想要一个临时表 它将使用 select 语句插入值 但每次我运行查询时 总是出现错误 子查询返回超过 1 个值 当查询跟随 gt 或子查询用作表达式时 不允许这样做 该语句已终止 0 行受影响 这很奇怪 因为代码中似乎没有错误 但如果有的
  • 当日期有时间时,访问查询将不起作用

    我有一个查询 select from tblClient where IntakeDate 5 31 2011 我确实知道有 8 条记录有该日期 但此查询没有提取任何具有该日期的记录 这 8 条记录有时间和 短日期 例如 5 31 2011
  • 基于两个数据库表之间的数据比较创建oracle视图

    我有下表 我想创建视图以便descr O 以及对于常见的id isin两个表中的字段值 检查ratio字段并只取其中的行ratio字段值低 for descr O 如果 id isin 存在于一个表中但不存在于另一个表中 则获取这些行 双向
  • 使用 Athena 从 AWS WAF 日志中的规则组列表获取终止规则

    我跟着这些说明 https docs aws amazon com athena latest ug waf logs html将我的 AWS WAF 数据放入 Athena 表中 我想查询数据以查找具有 BLOCK 操作的最新请求 此查询
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern

随机推荐

  • Google 任务更新错误

    我正在尝试使用以下代码更新任务 function updtsk task id var url https www googleapis com tasks v1 lists default tasks id var req method
  • 如何强制AWS ECS将容器迁移到另一个ASG?

    我使用 user data 对 ECS 中使用的主机进行初始配置以运行容器 我希望能够在更新 user data 后告诉 AWS ECS 将容器迁移到新创建的主机 我怎样才能做到这一点 我正在使用 Terraform 进行 AWS 基础设施
  • 在 Coq 中使用我自己的 == 运算符重写策略

    我试图直接从字段的公理证明简单的字段属性 经过对 Coq 原生现场支持的一些实验 像这个 我决定最好简单地写下 10 条公理并使其自成一体 我在需要使用的时候遇到了困难rewrite与我自己的 运算符自然不起作用 我意识到我必须添加一些我的
  • 如何深入LDAP树查找可以在Spring LDAP Security中进行身份验证的用户

    我想使用 Spring Security LDAP 身份验证 不过我想递归地遍历 ldap 树 不幸的是 我只能找到一个级别或深度的用户 例如 我的用户树如下所示 ouUsers 有用户 user1 user2 等 和子树 ouGenel
  • 带时区的 Java 日期验证器

    当日期中包含 EDT EST 时 我们是否有任何 API 来验证日期是否有效 我尝试过 Joda Java SimpleDateFormat 但我无法解析日期 以下是我收到的示例格式 2017 09 25 16 18 15 099 0400
  • 检查 json 响应是数组、整数还是字符串作为键?

    我收到 json 响应 其中 products 键有时具有 int 值 有时它具有数组 如何检查它是否有数组或Int products 25 or products 77 80 81 86 我正在用这个 self productsCount
  • Django/Python:在模板中显示 pdf

    我在 python 2 7 中使用 django 1 8 我想在模板中显示 pdf 才知道 感谢MKM 的回答我将其呈现在整页中 你知道如何渲染吗 这是我的代码 def userManual request with open C User
  • 使用正则表达式删除CSS注释

    如何使用 CSS 删除注释Regex Replace 注意 我无法使用 C 中提到的正则表达式 正则表达式删除CSS注释 这通常就足够了 假设cssLines是一个包含 CSS 文件所有行的字符串 Regex Replace cssLine
  • 将二维数组传递给常量参数的函数

    我从中学到了C 底漆 如果你想保护数组不被函数意外修改 你应该添加const函数定义头中指针声明之前的修饰符 遵循这个明智的建议 在下面的最小示例中 我尝试传递一个非常量二维数组array到函数Sum2D 其中一个参数是pointer to
  • 如何在 JTable 中创建翻转效果?

    在我的应用程序中 我想使用 JTable 的行创建翻转效果 例如 当鼠标进入该行时 该行的背景颜色会发生变化 反之 当鼠标退出该行时 该行的颜色将恢复正常 我怎样才能做到这一点 使用下面的代码 它将让您了解如何对 JTable 的行应用翻转
  • TabWidget 之间的分隔线

    TabWidget下的android divider属性是否有效 我尝试了 android 的选项卡布局教程只是为了测试 http developer android com resources tutorials views hello
  • JavaScript 中按字符串属性值对对象数组进行分组?

    我讨厌这个对象数组 每个对象都有一个日期 我希望能够将这些对象分组为月份 有没有办法转换这个 var data date 2016 08 13 date 2016 07 23 date 2016 08 11 date 2016 08 10
  • 指定的演员阵容无效#3

    我遇到这个问题 我收到 指定的转换无效 Visual Studio 内的错误列表中没有错误 这个错误可能来自我的 Access 数据库吗 private void Submit Click object sender EventArgs e
  • Ruby on Rails 4、Devise 和配置文件页面

    我是编码新手 所以这可能是一个简单的问题 我大约一个月前开始使用 RoR 不幸的是 我遇到了坎坷 似乎无法克服 我尝试过查看其他 SO 问题来寻求帮助 但我仍然是新手 所以编码建议对我来说仍然有点陌生 我希望有人能用更适合新手的术语来表述
  • Android:从重定向到另一个 url 的 url 连接 (graph.facebook.com) 获取位图

    我已经做了一切来获取一个 url 在那里我可以获取 Facebook 用户的个人资料图片 现在剩下的唯一问题是将该图像放入位图对象中 Since http graph facebook com现在首先将连接重定向 正如我们在网址中看到的 h
  • 了解/控制 MLT 融化幻灯片?

    考虑以下bash脚本 在 Ubuntu 18 04 melt 6 6 0 上 它使用melt制作幻灯片并在窗口中本地播放 SDL 使用者 大部分复制自https mltframework org blog making nice slide
  • 如何从 webpack 构建中删除 eval 和 Function 构造函数以避免 CSP 问题

    问题在于 Webpack 在编译代码中使用 eval 因此 Chrome 扩展程序和 Firefox 插件无法工作 因为它需要 CSP 属性中的 unsafe eval 指令 而这是不允许的 我使用 Vue js 作为前端webpack a
  • 将整数转换为字符串时出现问题

    我正在尝试将 EditText 字段中的两个数字相加 到目前为止 我有下面的代码 我相信它将 EditText 字段 pos1 deg 和 pos2 deg 转换为整数 deg1 和 deg2 deg1 Integer parseInt p
  • 如何在 axios 中设置 POST - multipart/form-data 的 MIME 类型?

    我需要使用 MIME 发送 POST 请求 multipart form data 这是我的 POST 标头的默认配置 axios defaults headers post Content Type multipart form data
  • 如何在从另一个表中提取数据的同时创建带有约束的表

    我正在尝试创建一个作家表 其中包含作者 ID 姓氏 名字 ISBN 以及每位作者所写书籍的书名 虽然使用与作者和书籍表相同的数据类型 但不复制这些表中的数据 并将作者 ID 作为主键 标题不为空 ISBN 作为引用 books 表中 ISB