我有一个带有 FILESTREAM 列的表,它有两个为同一个 FILESTREAM 列指定的唯一约束,即:
ALTER TABLE [dbo].[TableName]
ADD CONSTRAINT [UQ__TableName__33C4988760FC61CA]
UNIQUE NONCLUSTERED ([GUID_Column]);
GO
ALTER TABLE [dbo].[TableName]
ADD CONSTRAINT [UQ__TableName__33C49887145C0A3F]
UNIQUE NONCLUSTERED ([GUID_Column]);
GO
Run Code Online (Sandbox Code Playgroud)
我想删除一个独特的约束,因为它们是重复的。但是,当我尝试删除两个重复约束之一时,我收到以下错误。
具有 FILESTREAM 列的表必须具有非 NULL 唯一 ROWGUID 列。
任何人都知道如何删除两个约束之一?
出于一致性原因,我想使关系中的列不可修改。
背景故事是我有一个:n 关系,其中“连接”关系具有附加值。我不希望任何人能够更改关系伙伴的 ID。
到目前为止我想出了什么:
创建一个触发器来检查 NEW 值是否与 OLD 值相同。但如果条件证明为 TRUE,我不知道如何拒绝 UPDATE 操作。
到目前为止,这是我的触发器:
CREATE TRIGGER deny_nton_change BEFORE UPDATE ON Schueler_in_Klasse
FOR EACH ROW BEGIN
IF NEW.Schueler_ID != OLD.Schueler_ID OR NEW.Klasse_ID != OLD.Klasse_ID THEN
END IF;
END;
Run Code Online (Sandbox Code Playgroud) 制作外键约束DEFERRABLE INITIALLY IMMEDIATE而不是的后果是什么NONDEFERRABLE?
StackOverflow 上的这个答案提到了不再将唯一索引用于可延迟唯一约束所带来的性能影响,我可以与之相关。但是,使外键可延迟有哪些缺点或副作用?
我只能看到一个缺点:早期写入引入的不一致可能在COMMIT发生之前无法检测到。然而,我们的应用程序的存储层将所有 DML 语句延迟到事务结束,因此永远不会读取不一致的 DB 状态(甚至不会被导致它的代码),并且只能在COMMIT任何情况下检测到。
还有其他人吗?
如果重要的话,我们正在考虑在某个表族中制作所有外键DEFERRABLE INITIALLY IMMEDIATE,但只在执行大量相互依赖的插入/更新/的特定作业(大约20 个访问这些表)中延迟它们删除。
TL;DR:我们在制作外键时需要注意DEFERRABLE INITIALLY DEFERRED什么?
我有以下数据库设计(通过=>外键约束描述):
公司[编号] CompanyRealm[id, company_id=>Company.id] many2many 项目[id, company_id=>Company.id] ProjectRealm[id, project_id=>Project.id, company_realm_id=>CompanyRealm.id] many2many
问题是提供的数据库设计允许不一致的数据。例如:
公司1 (id= 1 ) 公司 2(id= 2 ) CompanyRealm(id=11, company_id= 1 ) 项目(id=33, company_id= 2 ) ProjectRealm(id=44, project_id=33, company_realm_id=11)
(Company可以有很多Realms,Project属于Company可以涉及任意数量的公司的Realms)
ProjectRealm 指的是两个不同的公司:
我的数据库设计有问题吗?
如果是 - 违反了哪些处方?
如果否 - 如何防止错误的数据插入(通过约束?触发异常?)
我正在使用 postgres 表验证规则并尝试CHECK为数组列设置约束。一个想法是只允许长度 > 0 的数组。
这是我想要实现它的方式:
create table words_table (
id serial primary key,
words varchar(20)[] CHECK (array_length(words, 1) > 0)
);
Run Code Online (Sandbox Code Playgroud)
但看起来它不起作用。o_o
insert into words_table (words) values ('{}');
//INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
如何实现这样的约束?
我有一个正在迁移到 SQL Server 的旧 Access 表,其中有一个名为“LinkedID”的字段。这个字段在大约 5 年前大部分时间都没有使用,因此对于许多历史记录,它要么为空,要么默认为“00000000”。但是,展望未来,我们希望将其设置为不允许重复值(假设 1,000 条记录为空,500 条记录为“00000000”,大约 10,000 条是我们想要的实际唯一值)。
调查它,因为我有多个记录设置为“00000000”和多个为空,我知道我不能使用唯一约束。有没有一种方法可以创建一个检查约束来检查插入/更新的值是否唯一(如果不是全部为 0 或为空)?或者如果它不能通过检查约束工作,我的另一个想法是可能使用插入/更新触发器以某种方式验证数据?
在 SQL Server 中,我部署了一个带有UNIQUE约束的表:
CREATE TABLE [dbo].[Something] (
[IdentityId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID()
-- Whatever else...
)
Run Code Online (Sandbox Code Playgroud)
这使得 SQL Server 创建一个唯一索引来支持约束。该索引将自动生成名称,看起来像
UQ__tmp_ms_x__1F778345BD
Run Code Online (Sandbox Code Playgroud)
where 的UQ意思是“独特的”,其余的都很好,对我来说是随机的。如果我对同一个表有两个唯一约束,它们看起来就像两个随机字符串,这不是很方便。
创建唯一约束时,是否可以指定在后台创建的索引的名称?
我使用 Postgres 11 并想更改支持大表(约 7.5 亿行)主键的索引。主键是bigint列id,我想使用该INCLUDE术语包含一个额外的列。这需要在没有表重写的情况下发生(即没有新的/更改的列)。
删除当前PRIMARY KEY约束并不方便,因为很多其他表都引用了目标表。我想可以删除FOREIGN KEY所有这些表的PRIMARY KEY约束,然后删除约束,使用新索引重新创建,然后重新创建FOREIGN KEY约束。有没有更好的方法来做到这一点?
我有一个 PostgreSQL 表phase_steps,包含以下示例行:
phase_step_id|step_type|step_status|
-------------+---------+-----------+
1| RESEARCH| |
2| SURVEY| |
Run Code Online (Sandbox Code Playgroud)
更新step_status列的值取决于该值
step_type是什么。
当step_type为“RESEARCH”时,只能输入“COMPLETE”或“INCOMPLETE”值step_status。
当step_type为“SURVEY”时,只能输入“ASSIGNED”或“NOT ASSIGNED”值step_status。
step_status我尝试通过以下过程管理“研究”约束:
create or replace function insert_step_status_value() returns trigger as $$
begin
if (new.step_status != 'COMPLETE') or (new.step_status != 'INCOMPLETE')
from phase_steps where step_type = 'RESEARCH'
then
raise exception 'Status value not in range for this phase step';
end if;
return new;
end;
$$ language plpgsql;
create trigger check_step_status_value before update …Run Code Online (Sandbox Code Playgroud) postgresql trigger database-design constraint check-constraints
我正在创建一个存储足球比赛的数据库。
每轮,任何特定的足球俱乐部只能踢一场比赛(主场或客场)。
例如,插入后
INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Real);
插入例如
INSERT INTO Match (Round, Home, Away) VALUES (1, Bayern, Barcelona);
INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Bayern);
必须被禁止,因为巴塞罗那已经在第一轮与皇马打了一场比赛。他们不应该能够在同一轮对阵拜仁(无论是主场还是客场)。
如何确保不会发生此类插入?
我使用触发器吗?某种唯一的索引组合?我两种都尝试过,但都迷路了,实际上并没有得到预期的结果。
谢谢
constraint ×10
postgresql ×4
index ×3
sql-server ×3
trigger ×3
foreign-key ×2
consistency ×1
ddl ×1
index-tuning ×1
mysql ×1
null ×1
oracle ×1