在Oracle 10g中,是否可以为外键定义引用完整性约束以引用多个父表中的主键.
例如:
DEPT_ID
10
11
12
DEPT_ID
13
14
15
DEPT_ID
16
17
18
EMP_ID DEPT_ID
500 11
501 15
我希望EMP.DEPT_ID能够引用DEPT_AMER,DEPT_APAC和DEPT_AMER中的某个部门ID.有没有办法定义参照完整性来满足这种需求.所有3个表中的DEPT_ID都是从一个公共序列生成的,并保证是唯一的.
如果无法使用引用完整性约束,是否有更好的方法来维护此数据完整性?
有人可以帮助我了解配置 SQLAlchemy 模型的总体情况,以便在各个级别确保引用完整性吗?
按照引用完整性应该由数据库表达和强制执行的想法,我创建了一个模式(当前在 Postgresql 中),其中包含我认为需要的所有约束,从而为我提供了一个我相信将强制执行引用完整性的数据库。
然后,我开始在该数据库之上构建一个应用程序,在声明模式下使用 SQLAlchemy (0.7)。
经过搜索和阅读后,我了解到我可以配置:
所有这些选项都有默认值。
但我很困惑,我实际上需要对 SQLAlchemy 模型做多少事情,以确保 SQLAlchemy 在会话期间不会与数据库及其约束不同步。
如果我在 SQLAlchemy 中的 Columns() 定义上配置“onupdate”等,我到底能实现什么?
对于级联和passive_delete/passive_update规则,我可以在relationship()上配置。我在这里需要什么,为什么?
或者重新表述我的问题:SQLAlchemy 在多大程度上会意识到数据库模式中配置的约束,以及我必须在多大程度上(以及如何)在我的模型中重复它们?
还有什么我应该注意的吗?:)
我正在研究Oracle中的一组数据库表,并尝试找出一种通过稍微多态数据来强制引用完整性的方法.
具体来说,我有一堆不同的表 - 假设,我要说我有苹果,香蕉,橘子,橘子,葡萄和一百多种水果.现在我正在尝试制作一张描述涉及水果的步骤的表格.所以我想插入一行说"吃Apple ID 100",然后另一行说"剥香蕉ID 250",然后另一行说"冷藏Tangerine ID 500",依此类推.
从历史上看,我们已经通过两种方式完成了这项工作:
1 - 为每种可能的水果类型添加一列.使用检查约束确保除一列之外的所有列都为NULL.使用外键确保我们的水果的参考完整性.所以在我的假设示例中,我们有一个包含列的表ACTION, APPLEID, BANANAID, ORANGEID, TANGERINEID,和GRAPEID.对于第一个动作,我们有一排'Eat', 100, NULL, NULL, NULL, NULL, NULL.对于第二个动作,我们有'Peel', NULL, 250, NULL, NULL, NULL.等等
这种方法非常适合自动获取Oracle的所有RI优势,但它不能扩展到一百种类型的水果.你最终会得到太多的专栏来实用.只是弄清楚你正在处理哪种类型的水果成为一个挑战.
2 - 包含一个包含水果名称的列和一个包含水果ID的列.这也有效,但没有任何方法(AFAIK)让Oracle以任何方式强制执行数据的有效性.所以我们的专栏将是ACTION, FRUITTYPE,和FRUITID.'Eat', 'Apple', 100然后'Peel', 'Banana', 250,行数据将是等等.但是,'Eat', 'Apple', 90000000即使我们没有带有该ID的Apple,也没有任何东西阻止某人删除Apple ID 100或插入一个步骤.
有没有办法避免为每个单独的水果类型维护一个单独的列,但仍保留外键的大多数好处?(或者从技术上讲,如果我可以用一种巧妙的技巧隐藏复杂性,我可以说服使用一百列.它只需要在日常使用中看起来很清醒.)
澄清:在我们的实际逻辑中,"结果"是完全不同的表,几乎没有共性.考虑客户,员工,会议,房间,建筑物,资产标签等.步骤列表应该是自由格式的,并允许用户指定对这些事物的任何操作.如果我们有一个包含这些不相关的东西的表,我就不会有问题,但这也是一个非常奇怪的设计.
使用 PostgreSQL 9.2.4,我有一个users与table有 1:many 关系的表user_roles。该users表存储员工和其他类型的用户。
Table "public.users"
Column | Type | Modifiers
-----------------+-------------------+-----------------------------------------------------
uid | integer | not null default nextval('users_uid_seq'::regclass)
employee_number | character varying |
name | character varying |
Indexes:
"users_pkey" PRIMARY KEY, btree (uid)
Referenced by:
TABLE "user_roles" CONSTRAINT "user_roles_uid_fkey" FOREIGN KEY (uid) REFERENCES users(uid)
Table "public.user_roles"
Column | Type | Modifiers
-----------+-------------------+------------------------------------------------------------------
id | integer | not null default nextval('user_roles_id_seq'::regclass)
uid | integer |
role | character varying | not …Run Code Online (Sandbox Code Playgroud) postgresql triggers database-design referential-integrity constraints
我目前正在审查一个数据库设计,为了处理用户记录的删除,为了处理 DPA 和欧盟 GDPR 被遗忘权等要求,建议不要在用户记录和“相关的表,例如事务、通信事件等,以便在请求时可以删除用户记录,但相关表中的记录(使用非识别键/序列号)将保持不变。
因此,在我对此进行反驳并开启随后的“讨论”之前,我想知道是否有人认为在这种情况下删除或不删除参照完整性是可以接受的,或者是否应该使用其他方法 -例如屏蔽用户详细信息,或将用户记录更改为占位符记录以显示交易与已编辑的用户相关。
欢迎所有想法...
我有一个应用程序,其中大多数数据库表与另一个表有很强的关系.目前我正在使用外键强制引用完整性,但我想知道这是否真的是最好的方法.主表中的数据可以由业务用户从管理界面中删除,这意味着必须进行级联删除(或编写几个删除语句),但我不确定我是否真的想要删除所有其他数据同一时间.它可能是很多*可能*在以后有用的数据(报告可能?).但是,除非与主表存在关系,否则辅助表中的数据对应用程序本身基本无用.
最近我将maven HSQL依赖项从版本1.8.1.2升级到org.hsqldb:hsqldb:2.0.0.但是,使用HSQLDB的所有测试都失败了,但有一个例外:
org.hsqldb.HsqlException: user lacks privilege or object not found: REFERENTIAL_INTEGRITY
Run Code Online (Sandbox Code Playgroud)
我用Google搜索并找到了一些答案,但我发现它们很难理解.我该如何修复我的测试?在升级之前,我的测试工作正常.
如果数据库以典型的“父子”方式有一对表,是否有办法强制(不使用触发器)每个父项最多只能有四个子项?
所以我们有一个 Parent 表:
create table dbo.Parents (
ParentID char(2) not null primary key
/* Yada Yada Yada */
)
Run Code Online (Sandbox Code Playgroud)
还有儿童表:
create table dbo.Children (
ChildID char(2) not null primary key,
ParentID char(2) not null references dbo.Parents (ParentID)
/* usw */
)
Run Code Online (Sandbox Code Playgroud)
我们填充Parents表:
insert into Parents (ParentID) values ('aa'),('bb')
Run Code Online (Sandbox Code Playgroud)
我希望这个插入成功:
insert into Children (ChildID,ParentID) values
('a1','aa'),('a2','aa'),('a3','aa')
Run Code Online (Sandbox Code Playgroud)
但要使此插入失败:
insert into Children (ChildID,ParentID) values
('b1','bb'),('b2','bb'),('b3','bb'),('b4','bb'),('b5','bb')
Run Code Online (Sandbox Code Playgroud) 我正在尝试查找违反 ORA-02291: 完整性约束的记录::
我正在运行这个查询,但我没有得到任何结果::
SELECT child.parent_id
FROM child LEFT JOIN parent ON child.parent_id = parent.parent_id
WHERE parent.parent_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了某些内容,或者有哪些其他方法可以查找违反这些限制的记录。
我的Parent班级有两个子班级: Child和ParentHobby. Child 类有一个单一的 PK 并且@OneToMany它的映射有效。问题是我不知道如何将它映射到具有复合 PK 的 ParentHobby 类上。
家长:
//this works
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<Child> childList;
//this DOES NOT work
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<ParentHobby> hobbyList;
Run Code Online (Sandbox Code Playgroud)
孩子:
@Entity
@Table(name="CHILD")
public class Child {
@Id
@SequenceGenerator(name="CHILD_SEQ", sequenceName="CHILD_DB_SEQ", allocationSize = 1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CHILD_SEQ")
@Column(name="CHILD_ID")
private long childID;
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
@ManyToOne(optional …Run Code Online (Sandbox Code Playgroud) oracle ×3
sql ×3
cascade ×1
constraints ×1
database ×1
foreign-keys ×1
hibernate ×1
hsqldb ×1
jpa ×1
postgresql ×1
sql-server ×1
sqlalchemy ×1
triggers ×1