我有一个有4列的表:
create table dbo.Table (
Id int not null,
A int null,
B int null,
C nvarchar (4000) null
)
Run Code Online (Sandbox Code Playgroud)
我怎样才能确保A,B并且C是所有三个null或三个not null?
这可能是一个简单的答案,但我找不到它.我有一个整数列的表,我想,以确保当插入一行在此列中的值大于零.我可以在代码方面做到这一点,但认为最好在桌面上强制执行它.
谢谢!
我的上一次评论错误,现在一切都很好.
我在SQL Server 2008 db中有以下表:
tblItem,它有一个ItemID字段;
tblGoodItem,它还有一个ItemID字段,并且有一个指向tblItem的外键;
tblBadItem,它也有一个ItemID字段,并且还有一个指向tblItem的外键.
物品既不是好物品,也不是坏物品; 它必须是一个或另一个.但是,无论项目是好还是坏,它都必须是一个项目.
我的问题是:如何在tblGoodItem和tblBadItem中的ItemID字段中添加约束,以便两个表中都不能存在ItemID值?
我已经在类似的问题上阅读了Stack Overflow中的一些回复,我正在考虑这个解决方案:
创建一个视图vwItem,它在ItemID上的tblBadItem上连接tblGoodItem.
编写一个UDF fnItem,它对vwItem执行查询以查看视图中存在多少条记录.
有一个约束调用fnItem并验证返回的值是0.
这是最好的主意吗?有没有人有更好的主意?
我知道SQL约束可以强制数据满足有效性标准.但是,诸如"学生成绩只能在'最终'标志为假"时才能更新标准呢?这样的更新标准是否必须由应用程序处理?
我正在尝试创建一个表,其中一列中的值不能大于下一列.例如,我正在创建下表.
CREATE TABLE Price (
PriceID INT PRIMARY KEY IDENTITY (1,1),
OriginalPrice FLOAT NOT NULL,
CurrentPrice FLOAT NOT NULL,
Discount FLOAT,
ShippingCost FLOAT NOT NULL,
Tax FLOAT NOT NULL);
Run Code Online (Sandbox Code Playgroud)
并且当前价格不能大于OriginalPrice.
所以我尝试做的是
CurrentPrice FLOAT CHECK (CurrentPrice <= OriginalPrice) NOT NULL,
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:
Msg 8141, Level 16, State 0, Line 1
Column CHECK constraint for column 'CurrentPrice' references another column, table 'Price'.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.
Run Code Online (Sandbox Code Playgroud)
我不允许引用同一个表中的列吗?
采用以下示例表:
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
我想在表上添加字段级验证.有一个名为"account_number"的字段,该字段应始终通过"luhn"检查.我发现了一个名为"luhn_verify"的功能似乎正常工作(谷歌如果你感兴趣的话).它返回一个布尔值.我的问题是:
在PostgreSQL中使用触发器进行此验证与检查约束是否有任何主要的性能优势.
附加信息:
免责声明:
我觉得这可能已经得到了解答,但我似乎找不到明确的答案.如果是,请标记为重复并参考原始问题/答案.
可能是dba板的更好问题.
postgresql triggers database-design check-constraints postgresql-9.1
给定一个名为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 工作台中创建图表模型。我无法找到如何仅使用图表模型来添加如上所述的检查?
是否可以?
sql ×5
constraints ×4
sql-server ×4
postgresql ×3
t-sql ×2
triggers ×2
database ×1
diagram ×1
function ×1
mysql ×1
null ×1