- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试弄清楚如何使用 Postgresql 8 定义数据库的模式。
我有 2 个表:
期刊
,书籍
定义我拥有的出版物
Journal:
id_j, name, issn, other fields
Book:
id_b, name, isbn, author, other fields
我还有另一个表Scans
,它在逻辑上引用了前面两个表。
Scans:
id, medium, source, status
每个Journal
或Book
可以有多个Scan
,但是每个Scan
只能引用一个Journal
或 Book
。
为了形式化,我的第一个想法是在 Scans
中放置两个外键,例如
Scans:
id, medium, source, status, id_j, id_b
并填写id_j
或id_b
但这个解决方案在我看来有点奇怪。
我不想(如果可能的话)以这样的方式定义表格:
Scans:
id, medium, source, status, id_other_table, other_table_name
因为我希望表之间有一个正式的联系。
有什么想法吗?
最佳答案
CREATE TABLE source (
type CHAR(1) NOT NULL CHECK (type IN ('J', 'B')),
id INT NOT NULL,
PRIMARY KEY (type, id)
);
CREATE TABLE book (
type CHAR(1) NOT NULL CHECK(type = 'B'), id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (type, id) REFERENCES source (type, id) ON DELETE CASCADE
);
CREATE TABLE journal (
type CHAR(1) NOT NULL CHECK(type = 'J'), id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (type, id) REFERENCES source (type, id) ON DELETE CASCADE
);
CREATE TABLE scan (id INT NOT NULL, sourcetype CHAR(1) NOT NULL, sourceid INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (sourcetype, sourceid) REFERENCES source (type, id)
);
使用这种设计,您不应该直接从 book
或 journal
中删除记录:相反,从表 source
中删除,这将级联操作到适当的表。
您可以将book
和journal
共有的属性移动到source
。
关于sql - postgresql:tableA 或 tableB 的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509950/
全部, 我正在复习一些基本的 MySQL JOIN 教程。杰夫·阿特伍德 gives an example在他的博客上是这样的: SELECT * FROM TableA LEFT OUTER JOI
我有一个大表,我正在尝试添加一个字段,到目前为止,由于我正在处理的表大小,它的效率要高得多 CREATE TABLE A LIKE B; INSERT B SELECT * FROM A; 进行更改时
http://sqlfiddle.com/#!18/d1cf0/6 TABLE HEADER ( [HeaderID] VARCHAR(3), [description] VARC
我是一名刚学数据库的学生... 我有两张 table 。用户和行程。 每当将新的行程添加到数据库时,我希望它触发“totalMiles”列中用户表的更新。我希望它采用 Trip.userID 并仅更改
我在 Codeigniter 工作。我在 MySql 数据库“menus”和“menus_child”中有两个表。结构是: table: menus 编号 |菜单名称 1 |产品 table: men
我有两张 table create tableA ( idA int primary key, idB foreign key references tableB(idB) ); cr
我有一个表图片 create table pictures ( picture_id int(10) unsigned NOT NULL AUTO_INCREMENT, mall_id flo
这个问题已经有答案了: cartesian product in pandas (13 个回答) 已关闭 4 年前。 我想将两个数据帧合并在一起以模仿“select * from A, B”,例如,表
这是一个有效的 mysql 语句吗? select * from TableA , TableB ; 如果不是,选择这两个表的正确 mysql 语句是什么。 为什么我认为这有问题,因为我写了一个 my
我的 TableA 有数十万行,而且大小还在增加。没有分区,速度下降得非常明显。 因此,我创建了一个名为 TableB 的新表,其中的列与 Oracle SQL Developer 中的 TableA
当我按如下方式查询 mysql 数据库时,出现如标题所示的错误。不知道为什么,问题出在 group by 语句上,但我尝试了几种变体,但似乎没有任何效果。 SELECT TableA.Name, DA
我有两张 table 。 msUser 和 msUserChar。我在 msUser 和 msUserChar 之间建立了关系,其中 msUser 中的 PK 是 msUserChar 中的 FK 我
我正在创建一个数据库,并且我有表 ProjectDetails.TimeCardExp 和 ProjectDetails.Project。 TimeCardExp 表有一列 ExpenseDate,在
我正在尝试弄清楚如何使用 Postgresql 8 定义数据库的模式。 我有 2 个表: 期刊,书籍 定义我拥有的出版物 Journal: id_j, name, issn, other fields
我有一个包含几张工作表的工作簿,每张包括一个列表对象(一个表格) 我的目的是从不同的列表对象中获取数据并将其粘贴到另一个列表对象中。或者更准确地说,在另一个表中一个接一个地复制几个表的几列。 到目前为
基本上,我想要的是,如果 tableB 中有一条类型为“X”的记录,我想查看它,否则我不想查看,但我想要 tableA 中的所有记录。 我知道我可以通过将 tableB.type = 'X' 放在 L
我需要为 tableB 的每个值选择并插入 tableA 的值。有什么建议么? 所以基本上结果表将是这样的: 1 | 1 1 | 2 1 | 3 2 | 1 2 | 2 2 | 3 最佳答案 这听起来
我的数据是这样的: TableA - id INT - is_in_table_b BOOL TableB - id INT - table_a_id INT 我在重组数据结构时不小心删除了开发机器上
1st question: 我试图将表 B 中的字段插入到表 A 中,其中我有一个条件并为列 A 设置了一个案例,但它不起作用。是否可以在不更新的情况下做到这一点? insert into table
我正在尝试在 JOIN 与第二个表之后更新表。 UPDATE 仅适用于第一个 SET。 代码如下: update Table_A join Table_B on Table_A.date = Tab
我是一名优秀的程序员,十分优秀!