ms-access - MS Access 中的唯一性约束

标签 ms-access foreign-key-relationship unique-constraint

在我必须为 MS Access 设计的数据库中,我有一个名为“测量”的表,其中存储某些测量参数(测量值、标准偏差等) - 每行都有一个整数 ID 作为其主值关键。

然后其他表使用外键关系链接到此测量表。某些表包含两个不同的“measurementID”字段,它们都链接到这一测量表。但是,每个测量值只能与这些字段中的一个链接。

如何对多个表中的多个字段强制执行唯一性约束?有办法吗?

最佳答案

此类约束确实可以使用 CHECK 在 ACE/JET 中实现限制。

那些说他们通常会使用触发器来完成此类事情的人并没有意识到 CHECK 之间的区别。 ACE/Jet 和 SQL Server 中的约束分别:在 SQL Server 中它们不能包含子查询,这意味着它们不能引用同一表中其他行中的值或其他表,而在 ACE/Jet 中可以。

在理想的(但据我所知还不存在)SQL-92 产品中,所描述的唯一性将使用ASSETION 来实现。 ,处于模式级别。因为 CHECK 约束是表级的,并且仅在定义它们的表为 UPDATE 时才进行检查。 d 或INSERT ed,您需要输入适当的 CHECK对所有引用表的约束(这同样适用于 SQL Server 触发器)。这是一个简单的示例:

CREATE TABLE Parent 
(
   parent_ID INTEGER NOT NULL IDENTITY UNIQUE, 
   data_col INTEGER NOT NULL
)
;
CREATE TABLE Child1
(
   parent_ID INTEGER NOT NULL
      REFERENCES parent (parent_ID), 
   data_col INTEGER NOT NULL
)
;
CREATE TABLE Child2
(
   parent_ID INTEGER NOT NULL
      REFERENCES parent (parent_ID), 
   data_col INTEGER NOT NULL
)
;
ALTER TABLE Child1 ADD
   CONSTRAINT child1__no_dups_in_child2
   CHECK (NOT EXISTS (
                      SELECT * 
                        FROM Child1 AS C1
                             INNER JOIN Child2 AS C2
                                ON C1.parent_ID = C2.parent_ID
                     ))
;
ALTER TABLE Child2 ADD
   CONSTRAINT child2__no_dups_in_child1
   CHECK (NOT EXISTS (
                      SELECT * 
                        FROM Child1 AS C1
                             INNER JOIN Child2 AS C2
                                ON C1.parent_ID = C2.parent_ID
                     ))
;

但是,我想知道您是否有子类(即可以键入 ID 表示的每个实体),在这种情况下您应该能够使用 FOREIGN KEY s 和行级 CHECK约束(或者验证规则,如果您更熟悉 MS Access 接口(interface)而不是 CHECK 约束所需的 SQL DLL)。逻辑会比表级更容易实现 CHECK约束,只需观察 CASCADE 中的周期引用行动。这是另一个简单的例子:

CREATE TABLE Parent 
(
   parent_ID INTEGER NOT NULL IDENTITY, 
   child_type VARCHAR(4) NOT NULL, 
   CONSTRAINT child_type__values 
      CHECK (child_type IN ('Boy', 'Girl')), 
   UNIQUE (child_type, parent_ID)
)
;
CREATE TABLE Girls
(
   parent_ID INTEGER NOT NULL, 
   child_type VARCHAR(4) DEFAULT 'girl' NOT NULL, 
   CONSTRAINT girl_child_type__must_be_girl
      CHECK (child_type = 'girl'),
   FOREIGN KEY (child_type, parent_ID)
      REFERENCES Parent (child_type, parent_ID), 
   data_col INTEGER NOT NULL
)
;
CREATE TABLE Boys
(
   parent_ID INTEGER NOT NULL, 
   child_type VARCHAR(4) DEFAULT 'boy' NOT NULL, 
   CONSTRAINT boy_child_type__must_be_boy
      CHECK (child_type = 'boy'),
   FOREIGN KEY (child_type, parent_ID)
      REFERENCES Parent (child_type, parent_ID), 
   data_col INTEGER NOT NULL
)
;

关于ms-access - MS Access 中的唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/732274/

相关文章:

ms-access - 从 MS Access 数据库表中的字段中删除字符

sql - 如何识别 4 列中行 ID 最低的文本值?

java - 丢失具有 JPA 唯一约束的事务?

ruby-on-rails - 关系数据库(外键)

sql - 更新外键值

Postgresql 函数无法按预期使用 INSERT INTO

java - 给定 'java.sql.SQLIntegrityConstraintViolationException' 是否可以确定错误的列

ms-access - 如何增加 Access 中的日历大小?

sql - Ms Access 连接不同数据库中的表

java - Hibernate - 使用包含父 ID 的复合键 - OneToMany