【问题标题】:SQL Server - Add Constraint for existing table using Alter Table functionSQL Server - 使用 Alter Table 函数为现有表添加约束
【发布时间】:2013-12-17 03:28:24
【问题描述】:

我在使用 SQL 时遇到了一点麻烦。这是客户表:

ID      Name     Address                Phone
KP001   Bill     Jl Bali NO 27          81976524451
KP002   Jane     Jl Sandang NO 5        81876537521
KP003   Dion     Jl Kebon Jeruk NO 7    81684234913

原始结构表Customer:

CREATE TABLE Customer
(
ID char(5)primary key not null,
Name varchar(20),
Address varchar(30),
Phone varchar(12),
constraint cs2 check (LEN(ID)=5),
constraint cs3 check (ID like 'KP[0-9][0-9][0-9]'),
)

我想使用 Alter Table 更改表结构。我想向表客户添加约束,其中“否”后的地址必须是数字。

首先,在印度尼西亚,有些街道名称使用“NO”作为指示街道编号。并要求“NO”后的客户表是一个数字。我试过这个查询:

ALTER TABLE Customers WITH NOCHECK
ADD CONSTRAINT cs_address 
CHECK (CHARINDEX('no',Address)>1 AND
ISNUMERIC ( SUBSTRING (Address,7,2)) =1)

我知道查询不正确,但您能帮我修复错误并获得正确的结果吗?

*对不起,如果我的英语不好

【问题讨论】:

    标签: sql-server-2008 alter-table check-constraints isnumeric charindex


    【解决方案1】:

    如果您希望验证地址始终以NO 开头,后跟一个数值,那么

    ALTER TABLE Customers WITH NOCHECK
    ADD CONSTRAINT cs_address
    CHECK
    (
            CHARINDEX('no', Address) >= 1 
        AND ISNUMERIC(LTRIM(RTRIM
                    (SUBSTRING (Address, CHARINDEX('no', Address) + 2, 7)))) = 1
    )
    

    【讨论】:

    • 哦!因此,如果您想允许包含“NO”但不需要以它开头的地址,那么请查看更新后的答案,@cindy。
    • 我只是尝试了该查询,但我遇到了问题。如果我插入值“Jalan Jakarta NO 10”而不是显示消息:INSERT 语句与 CHECK 约束冲突。我认为是因为在“不”这个词之前。但我想要的是,当我插入值“Jalan Jakarta NO 10”时,它应该被执行
    • 对不起,如果我误解了,但我在哪里可以看到更新的答案? @vikdor
    • 哦,好的。但我收到消息:找不到对象“地址”,因为它不存在或您没有权限。我该怎么办?
    • 地址应该是你的列名! @辛迪
    猜你喜欢
    • 2012-04-28
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多