我已经确定了 3 种情况。
注册表上有一个触发器来计算 GPA。如果学生有成绩,它会更新或在 GPA 表中插入一个条目;没有成绩,没有 GPA 表条目。
我可以删除没有注册的学生(#1)。我可以删除一个有注册和成绩的学生(上面的#3)。但是我不能删除有注册但没有成绩的学生(#2)。我得到了一个参考约束违规。
DELETE 语句与 REFERENCE 约束“FK_dbo.GPA_dbo.Student_StudentID”冲突。冲突发生在数据库“”、表“dbo.GPA”、“StudentID”列中。
如果我无法删除没有注册(也没有 GPA 条目)的新学生,那么我会理解约束违规,但我可以删除该学生。这是一个注册但没有成绩(仍然没有 GPA 条目)的学生,我无法删除。
我已经修补了我的触发器,所以我可以继续前进。现在,如果您有注册,无论如何触发器都会将您插入 GPA 表中。但我不明白潜在的问题。任何解释将不胜感激。
物有所值:
这是数据库的一个片段:

--编辑--
这些表都是由 EntityFramework 创建的,我使用 SQL Server Management Studio 来生成这些表。
以下是带有约束的创建表语句。:
GPA 桌子:
CREATE TABLE [dbo].[GPA](
[StudentID] [int] NOT NULL,
[Value] [float] NULL,
CONSTRAINT [PK_dbo.GPA] PRIMARY KEY CLUSTERED
( …Run Code Online (Sandbox Code Playgroud) 说我有一个约束
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Run Code Online (Sandbox Code Playgroud)
需要修改,以便邮政编码长度为6.
我是否zipchk先删除约束然后重新创建它?
ALTER TABLE distributors DROP CONSTRAINT zipchk;
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 6);
Run Code Online (Sandbox Code Playgroud)
或者是否有MODIFY(类似)命令:
ALTER TABLE distributors MODIFY CONSTRAINT zipchk CHECK (char_length(zipcode) = 6);
Run Code Online (Sandbox Code Playgroud) 我有一张与这张相似的桌子
create table my_table
(
id serial,
attribute boolean,
number integer
)
Run Code Online (Sandbox Code Playgroud)
有没有办法让它在列numberIF attributevalue is 中强制不为空true?
因此,如果使用属性值“true”保存记录,则必须为 number 指定一个值。
编辑:经过一些挖掘,我试过这个
alter table my_table
add constraint number_must_have_value CHECK (attribute = 't' and number IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
它抛出约束被某行违反,但如果我运行:
select * from my_table where attribute = 't' and number IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
我检索 0 行。所以我的数据似乎没问题?
无论如何,我尝试使用
constraint number_must_have_value NOT VALID CHECK (attribute = 't' and number IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
但无法使 NOT VALID 选项起作用。我收到语法错误。是不是在正确的地方?
我正在尝试找出提高非常慢查询性能的方法。它有更明显的问题,但我注意到的一件事是 WHERE 子句中的条件之一是 'AND t.data IS NOT NULL' 而表 t 的 'data' 列没有为 NULL 的条目并且确实有一个 NOT NULL 约束。
所以我想知道查询优化器是否能够忽略条件。我的想法是,它不能仅仅因为约束而这样做(因为不能保证它是否是用 NOVALIDATE 创建的),但可能足够“聪明”以使用有关列中 NULL 字段数量的统计信息。
我自己的测试是不确定的,我无法找到有关此主题的任何进一步信息。
我在 SQL Server 2008 中定义了以下索引视图(您可以从 gist下载工作架构以进行测试):
CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
user_id
, currency_id
, SUM(transaction_amount) AS balance_amount
, COUNT_BIG(*) AS transaction_count
FROM dbo.transactions
GROUP BY
user_id
, currency_id
;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
user_id
, currency_id
);
GO
Run Code Online (Sandbox Code Playgroud)
user_id、currency_id和transaction_amount都定义为 中的NOT NULL列dbo.transactions。但是,当我查看 Management Studio 的对象资源管理器中的视图定义时,它在视图中将balance_amount和都标记transaction_count为NULL可列。
我查看了几个讨论,这是其中最相关的一个,建议对函数进行一些改组可能有助于 SQL Server 识别视图列始终为NOT NULL. 但是,在我的情况下不可能进行这种改组,因为在索引视图中不允许 …
是否有 SQL Server 2008 等效于 Oracle 中的 USING INDEX 子句?特别是对于构造:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
Run Code Online (Sandbox Code Playgroud)
在关于唯一索引的 Sql Server文档中,它指出(强调):
唯一索引通过以下方式实现:
PRIMARY KEY 或 UNIQUE 约束
当您创建 PRIMARY KEY 约束时,如果表上的聚集索引尚不存在并且您没有指定唯一的非聚集索引,则会自动创建一个或多个列上的唯一聚集索引。主键列不能允许 NULL 值。
这似乎意味着有一种方法可以指定主键应该使用什么索引。
我有一个containers可以与多个表建立多对多关系的表,假设它们是plants,animals和bacteria。每个容器可以包含任意数量的植物、动物或细菌,并且每个植物、动物或细菌可以在任意数量的容器中。
到目前为止,这非常简单,但我遇到的问题是每个容器应该只包含相同类型的元素。例如,同时包含植物和动物的混合容器应该是数据库中的约束违规。
我的原始架构如下:
containers
----------
id
...
...
containers_plants
-----------------
container_id
plant_id
containers_animals
------------------
container_id
animal_id
containers_bacteria
-------------------
container_id
bacterium_id
Run Code Online (Sandbox Code Playgroud)
但是对于这个模式,我无法想出如何实现容器应该是同构的约束。
有没有办法通过参照完整性来实现这一点,并在数据库级别确保容器是同类的?
我为此使用 Postgres 9.6。
我有一块在 PostgreSQLSQL中创建了TABLE一个SELECT语句;我想向表中添加约束,例如,一列不能是null.
我在 Postgres 文档中找不到对此有效的 SQL,因此似乎不可能。
实现这种功能的最佳方法是什么?如果违反约束,我希望表的创建失败。
我无法预先创建带有约束的表,因为某些列可能存在一些变化,因为它们是动态过程的结果。
无论我读过 CAP 还是 ACID,我都看到一致性被用来确保 DB 完整性约束。所以,我不明白,为什么用两个术语来指代同一件事,或者完整性和一致性之间存在差异?
我读到了
总之,原子性、一致性、隔离性、持久性是事务的属性。确实,原子性+隔离性足以让您滚动自己的一致性。但是我们也可以滚动我们自己的原子性,滚动我们自己的隔离,滚动我们自己的持久性(durability)。当我们推出自己的产品时,我们必须用自己的血汗和括号为功能买单。我们并没有说这些属性是由交易系统提供给我们的。
这表明一致性是用户应用程序可以在数据库完整性约束之上提供的东西。这不是由数据库提供的属性,因为 AID 属性是。为什么要像对系统提供的其他 AID 属性一样给 C 标题?
在许多一对多(数据模型)维基百科的文章使用作者和图书的例子:
例如,将 A 视为作者,将 B 视为书籍。一个作者可以写几本书,一本书可以由几个作者写。
在关系数据库管理系统中,这种关系通常是通过关联表(也称为交叉引用表)来实现的,例如,AB 具有两个一对多关系 A -> AB 和 B -> AB。在这种情况下,AB 的逻辑主键由两个外键(即 A 和 B 的主键的副本)形成。
有了约束,你会如何执行一本书必须有至少一个作者?
笔记:
constraint ×10
postgresql ×4
sql-server ×3
consistency ×1
many-to-many ×1
null ×1
optimization ×1
oracle ×1
primary-key ×1
terminology ×1
view ×1