采用以下示例表:
CREATE TABLE [dbo].[tbl_Example](
[PageID] [int] IDENTITY(1,1) NOT NULL,
[RequireLogin] [bit] NOT NULL,
[RequireAdmin] [bit] NOT NULL,
[HideIfLoggedIn] [bit] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
如何重写上面的内容以包括检查约束,如下所示:
[RequireAdmin]是假,如果[RequireLogin]是假(即只允许[RequireAdmin]为真,如果[RequireLogin]是真实的,同时允许[RequireLogin]为真,并[RequireAdmin]为假[HideIfLoggedIn]为True[RequireLogin]t-sql sql-server constraints check-constraints sql-server-2008-r2
给定一个名为PostgreSQL的表requests,该表具有名为的列status和类似这样的约束:
ALTER TABLE requests ADD CONSTRAINT allowed_status_types
CHECK (status IN (
'pending', -- request has not been attempted
'success', -- request succeeded
'failure' -- request failed
));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,psql我可以提取有关此约束的信息:
example-database=# \d requests
Table "public.example-database"
Column | Type | Modifiers
----------------------+-----------------------------+-------------------------------------------------------------------
id | integer | not null default nextval('requests_id_seq'::regclass)
status | character varying | not null default 'pending'::character varying
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not …Run Code Online (Sandbox Code Playgroud) 我想为 Postgres CHECK IN 违规创建更具体的错误消息。例如,违反列上的以下 CHECK 约束:
management_zone varchar(15) NOT NULL CHECK (management_zone IN ('Marine', 'Terrestrial') ),
Run Code Online (Sandbox Code Playgroud)
应返回自定义错误消息,例如:“提示:检查拼写。仅允许的输入为:‘Marine’、‘Terrescial’。
到目前为止我见过的最好的解决方案是通过使用错误消息作为检查约束的名称来解决它,即
ADD CONSTRAINT c_managementzone_@Check_spelling._Only_allowed_inputs_are:_'Marine',_'Terrestrial' CHECK (management_zone IN ('Marine', 'Terrestrial') ),
Run Code Online (Sandbox Code Playgroud)
然后应用一个函数,通过用空格替换下划线来修复@符号后的错误消息,以使其更具可读性。然后使用 try 和 catch 语句调用该函数。
然而,这段代码是在我不熟悉的 t-sql 中,而且我也不了解足够的 PL/pgSQL 来转换和复制它。因此,我想知道是否有人可以建议如何在 postgres 中完成类似的事情,例如。使用函数和触发器?
t-sql 代码和解释可从此处获取,我将其复制粘贴到下面: https: //social.technet.microsoft.com/wiki/contents/articles/29187.t-sql-error-handling-for-check-约束.aspx
CREATE FUNCTION dbo.ufnGetClearErrorMessage2()
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @Msg NVARCHAR(4000) = ERROR_MESSAGE() ;
DECLARE @ErrNum INT = ERROR_NUMBER() ;
DECLARE @ClearMessage NVARCHAR(4000) ;
IF @ErrNum = 547
BEGIN
/*--how to find @ClearMessage:
SELECT @msg ,
CHARINDEX('@', …Run Code Online (Sandbox Code Playgroud) postgresql triggers function check-constraints custom-error-handling
假设我有一个这样的表:
CREATE TABLE IF NOT EXISTS
newbook_mast (book_id varchar(15) NOT NULL UNIQUE,
book_name varchar(50) ,
isbn_no varchar(15) NOT NULL UNIQUE ,
cate_id varchar(8) ,
aut_id varchar(8) ,
pub_id varchar(8) ,
dt_of_pub date ,
pub_lang varchar(15) ,
no_page decimal(5,0)
book_price decimal(8,2) ,
PRIMARY KEY (book_id)
);
Run Code Online (Sandbox Code Playgroud)
如果我想在列上添加检查,我只需写:
CHECK(no_page>0)
Run Code Online (Sandbox Code Playgroud)
但我没有编写代码,而是在 mysql 工作台中创建图表模型。我无法找到如何仅使用图表模型来添加如上所述的检查?
是否可以?
我正在尝试创建一个基本支付(BP)表
CREATE TABLE bp (
bpid VARCHAR(5),
FOREIGN KEY (bpid) REFERENCES designation(desigid),
upperlimit DECIMAL(10,2) NOT NULL,
lowerlimit DECIMAL(10,2) NOT NULL,
increment DECIMAL(10,2) NOT NULL
CONSTRAINT llvalid CHECK (upperlimit > lowerlimit)
);
Run Code Online (Sandbox Code Playgroud)
正如你在结尾附近看到的那样,我想检查是否upperlimit大于lowerlimit,我该怎么做?
怎么可能知道支持哪些数据注释Spring JPA?
例如,是否@Min支持?
@Min(value = 0)
private double calories;
Run Code Online (Sandbox Code Playgroud)
无论如何,如何声明CHECK约束?
更新
请阅读有关CHECK 约束的信息。另请注意,这@Min是一个超链接。
我正在尝试构建一个简单的酒店房间登记数据库作为学习练习。
CREATE TABLE HotelReservations
(
roomNum INTEGER NOT NULL,
arrival DATE NOT NULL,
departure DATE NOT NULL,
guestName CHAR(30) NOT NULL,
CONSTRAINT timeTraveler CHECK (arrival < departure) /* stops time travelers*/
/* CONSTRAINT multipleReservations CHECK (my question is about this) */
PRIMARY KEY (roomNum, arrival)
);
Run Code Online (Sandbox Code Playgroud)
我无法指定不允许为尚未腾出的房间插入新预订的约束。例如(下图),客人 'B' 在 'A' 退房之前入住 123 房间。
INSERT INTO HotelStays(roomNum, arrival, departure, guestName)
VALUES
(123, date("2017-02-02"), date("2017-02-06"), 'A'),
(123, date("2017-02-04"), date("2017-02-08"), 'B');
Run Code Online (Sandbox Code Playgroud)
这不应该被允许,但我不确定如何编写此约束。我的第一次尝试是编写一个子查询检查,但我无法找出正确的子查询,因为我不知道如何访问新插入的 'roomNum' 值来执行子查询。然后我还发现大多数 SQL 系统甚至不允许在 check 内部进行子查询。
那么我应该如何写这个约束呢?我读了一些关于触发器的文章,它们似乎可以解决这个问题,但这真的是唯一的方法吗?或者我只是密集而缺少编写约束的明显方法?
sqlite triggers subquery check-constraints relational-database
我有一张记录表
ID
EntityID
Value
Status
Run Code Online (Sandbox Code Playgroud)
和实体表
ID
Col1
Col2
CurrentRecordID
Run Code Online (Sandbox Code Playgroud)
CurrentRecordID应的Record绑在Entity与Status0
我有表两个检查约束之一Entity是检查,以确保CurrentRecordID实际上是对当前记录,一个Record是检查,以确保,如果它具有为0的状态,它EntityID有CurrentRecordID它的ID相符。
所以本质上,这两个检查约束做同样的事情,但分别在每个表上
检查约束是在事务的最后运行还是在表上每次插入/更新后像触发器一样运行?
如果它们在每次修改后运行,这两个约束是否会相互冲突(意味着,约束将在下一个表有机会更新其值之前抛出错误)。
这是运行以插入新记录并将其设置为给定实体的当前查询的示例
UPDATE Record SET Status = 1 WHERE Status = 0 AND EntityID = @EntityID
INSERT INTO Record(EntityID, Value, Status) VALUES(@EntityID, 100, 0)
DECLARE @RecordID INT = @@IDENTITY
UPDATE Entity SET CurrentRecordID = RecordID WHERE ID = @EntityID
Run Code Online (Sandbox Code Playgroud) 无论如何要创建一个包含多列的表,其中 2 个在同一记录中永远不应该为空。
例如,我需要以某种方式制作C,如果另一个不在同一记录中D,它们中的每一个都可能是。nullnull
我有什么办法吗?
| A | B | C | D | E |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
Run Code Online (Sandbox Code Playgroud)
他们永远不应该在一起有价值
我有这些模型:
class Container(models.Model):
...
class Meta:
constraints = [
models.CheckConstraint(
check=~Q(elements=None),
name='container_must_have_elements'
),
]
class Element(models.Model):
container = models.ForeignKey(Container),
related_name='elements',
on_delete=models.CASCADE
)
Run Code Online (Sandbox Code Playgroud)
我想强制每个Container对象必须至少有一个Element通过外键关系引用它的约束。
如您所见,我已经添加了一个检查约束。但是,对象~上的否定运算符Q似乎是被禁止的。django.db.utils.NotSupportedError: cannot use subquery in check constraint当我尝试应用生成的迁移时,我得到了。
如果没有否定运算符,约束似乎是有效的(它只会由于数据完整性错误而失败)。
有没有另一种方法可以表达这个约束,以便它支持CheckConstraint?(例如,有没有办法检查集合是否elements为空?)
database ×2
mysql ×2
postgresql ×2
sql ×2
sql-server ×2
triggers ×2
constraints ×1
diagram ×1
django ×1
django-orm ×1
django-q ×1
function ×1
java ×1
jpa ×1
oracle ×1
spring ×1
sqlite ×1
subquery ×1
t-sql ×1