我为足球比赛创建了数据库。
我有 2 个具有多对多关系的表,因此我还创建了一个连接表:
CREATE TABLE referee (
id_referee INT IDENTITY PRIMARY KEY,
id_type_referee INT NOT NULL,
first_name varchar(20) NOT NULL,
last_name varchar(30) NOT NULL,
date_of_birth DATE NOT NULL,
FOREIGN KEY(id_type_referee) REFERENCES type_referee(id_type_referee)
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE match (
id_match INT IDENTITY PRIMARY KEY,
id_stadium INT NOT NULL REFERENCES stadium(id_stadium),
id_season INT NOT NULL REFERENCES season(id_season),
date_of_match DATE NOT NULL,
audience INT CHECK (audience>=0)
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE match_referee(
id_referee INT NOT NULL,
id_match INT NOT NULL,
PRIMARY KEY(id_referee,id_match), …Run Code Online (Sandbox Code Playgroud) 有什么办法可以加快重新启用约束的速度?
作为更新我们仓库中几个表的工作的一部分,这是在几个小时内完成的,重新启用对所述表的约束可能需要一个多小时。其余的工作,即更新,大约需要 5 分钟。在更新开始之前禁用相同的约束是亚秒。
编辑
有问题的工作是在给定日期之前更新数据行上的 PK 和 FK,以防止这些记录出现在报告中。soft delete如果你愿意,一种记录方式。
大多数表格行大小均大于 130m 行,但超过 370m 行的除外。其他两个较小。
TableName rows
Table_1 371255778
Table_2 131703902
Table_3 131665535
Table_4 131665535
Table_5 131665535
Table_6 131665535
Table_7 19364988
Table_8 1458800
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令禁用每个表上的约束
ALTER TABLE database.dbo.table_name NOCHECK CONSTRAINT ALL;
以及以下再次重新启用它们
ALTER TABLE database.dbo.table_name WITH CHECK CHECK CONSTRAINT ALL;
没有同时运行的报告或其他作业。
是否需要很长时间才能重新启用约束预期行为,或者是否可以采取一些措施来加快速度?
提前致谢
下图描述了 GST 标识号的格式:
根据 2011 年印度人口普查,前 2 位数字表示唯一的州代码。例如,新德里的州代码是“07”,卡纳塔克邦的州代码是“29”。
接下来的 10 个字符表示纳税人的PAN(永久帐号)。
第 13 位数字表示具有相同PAN 的纳税人的注册号(或实体号)。
默认情况下,第 14 位数字是“Z”——目前没有任何意图。
第 15 位数字是校验和数字- 可以是数字或字母字符。
也许我可以通过 PATINDEX 或 Regex 进行验证?
以下示例之间有什么区别吗?
ProjNum int
CONSTRAINT nn_ProjNum NOT NULL
CONSTRAINT C_ProjNum CHECK (ProjNum >= 10)
Run Code Online (Sandbox Code Playgroud)
和
ProjNum int NOT NULL
CHECK (ProjNum >= 10)
Run Code Online (Sandbox Code Playgroud)
谢谢。
我目前正在 SQL Server 中处理下表
Table: order_status_logs
log_id INT NOT NULL IDENTITY(1,1)
order_id INT NOT NULL
status_id INT NOT NULL
log_date DATE NOT NULL
expected_by DATE NULL
Run Code Online (Sandbox Code Playgroud)
在此status_id列的表中,可能有以下值:
[1] - Pending
[2] - Ordered
[3] - Backordered
[4] - Received
Run Code Online (Sandbox Code Playgroud)
我想设置我的表,以便在尝试创建新记录时,如果不等于 4 ,expected_by则从NULL到 。基本上除非已收到订单,否则该表将始终需要该列的数据。NOT NULLstatus_idexpected_by
可以用 a 来做到这一点CONSTRAINT吗?或者这是我需要通过返回错误消息的程序或如果我不提供该列数据的内容来执行的操作?
我有 2 个表:TVSHOW 和 ACTOR。如果使用 DB2 的 ACTOR 表中不存在 TVSHOW 中插入的演员,我想拒绝记录。
db2 "ALTER TABLE TVSHOW ADD CONSTRAINT check_actor CHECK (actor in (select id from ACTOR))"
Run Code Online (Sandbox Code Playgroud)
我不断地遇到, During SQL processing it returned: SQL0546N The check constraint "check_actor" is invalid.
我怎样才能解决这个问题?
我设法使用存储过程创建了一个带有变量名的表的副本。但是我很难理解如何将约束合并到存储过程中。
问题:约束必须是一个变量,因为当它复制一个表时,它不能命名我拥有的与以前使用的相同的 PK。我在这些领域遇到语法错误。
我对 SQL Server 非常陌生......今天才刚刚开始学习!!所以请用虚拟术语解释。
到目前为止的代码如下:
CREATE PROCEDURE procFinancialPeriodTable
(@TABLENAME as varchar (50))
AS
DECLARE @SQL varchar(2000)
--SET @SQL = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[@TABLENAME]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
--drop table [dbo].[@TABLENAME]
BEGIN
SELECT @SQL = 'CREATE TABLE ' + @TABLENAME + '('
SELECT @SQL = @SQL + '[ID] [int] IDENTITY(1,1) NOT NULL,[FinPeriodNr] [int] NOT NULL,[FinCurrentPeriod] [bit] NULL,[FinStart] [date] NULL,[FinEnd] [date] NULL,[FinStatusOpen] [bit] NOT NULL,[PeriodClosedTS] [smalldatetime] NULL,[PeriodClosedUID] [varchar](3) NULL,)'
CONSTRAINT [PK_FinancialPeriod' + …Run Code Online (Sandbox Code Playgroud) 如何在不丢失自动创建的索引的情况下删除约束?
如果可以使用单个查询。
我有带有递归外键的表。它只是层次树结构:
CREATE TABLE tree (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
value INTEGER NOT NULL,
tree_id SMALLINT NOT NULL CHECK (tree_id > CAST(0 AS SMALLINT)),
parent_id INTEGER REFERENCES tree ON DELETE RESTRICT ON UPDATE RESTRICT,
EXCLUDE (tree_id WITH =) WHERE (parent_id IS NULL) -- allow only one root within tree
);
Run Code Online (Sandbox Code Playgroud)
如何拒绝插入非空parent_id和不同的记录tree_id?即外键parent_id只能引用id同一个内的主键tree_id。
我向这样的某些列添加了 NOT NULL 约束,希望命令非常快,因为NOT VALID. 但是,大约需要 60-100 秒,并且似乎一直锁定表(基于在此期间失败的其他事情)。这是在一个大约有 8,600,000 行的表上。为什么会这样?执行 4 个命令而不是 1 个命令会更好吗?
Postgres 12
ALTER TABLE my_table
ADD CONSTRAINT my_table_column1_not_null CHECK (column1 IS NOT NULL) NOT VALID,
ADD CONSTRAINT my_table_column2_not_null CHECK (column2 IS NOT NULL) NOT VALID,
ADD CONSTRAINT my_table_column3_not_null CHECK (column3 IS NOT NULL) NOT VALID,
ADD CONSTRAINT my_table_column4_not_null CHECK (column4 IS NOT NULL) NOT VALID;
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种可以生成创建 SQL 的方法,例如SQL选择约束时的 PgAdmin 选项卡。(pg admin 是怎么做的?)
我想实现一个通用方法,可以在处理后删除并重新创建外键约束。
我一定是在某个地方遗漏了一些东西..
Azure SQL
DispatchedOn is a DateTime column
ALTER TABLE [table] WITH CHECK ADD CONSTRAINT [CK_ReportDate6MonthRollGreater] CHECK ((CONVERT([date],[DispatchedOn])>='2022-12-07'))
GO
ALTER TABLE [table] CHECK CONSTRAINT [CK_ReportDate6MonthRollGreater]
GO
Run Code Online (Sandbox Code Playgroud)
我可以插入日期 2022-12-01
我有一个带有文本框字段的桌面应用程序,它是一个带有掩码值的RadMaskedNumericInput#6,这意味着它只能有 6 位数字。我将它存储在int类型的数据库列中。
当我检查数据库时,列中的某些值是 -2147483648。
我已尝试输入许多值,但无法重现此场景。我只能在此屏幕中输入 6 位数字。我尝试了最大值 999999,但它保持不变。
我只是获取文本框值,将其转换为int,然后通过存储过程将其插入到数据库中。
int value = (int)txtPrice.value;
Run Code Online (Sandbox Code Playgroud)
我试图输入负值以及尝试添加字母,但由于掩码,它不允许我添加除整数以外的任何值。
根据我的理解和知识,只有桌面应用程序可以插入或更新此列的值。
有谁知道为什么会这样?我该如何预防?
constraint ×13
sql-server ×7
postgresql ×3
alter-table ×1
db2 ×1
foreign-key ×1
index ×1
oracle ×1
recursive ×1
scripting ×1
syntax ×1
tree ×1