Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如何根据另一个属性限制一个属性的数据输入?_Sql_Sql Server_Sql Server 2012_Ddl - Fatal编程技术网

SQL-如何根据另一个属性限制一个属性的数据输入?

SQL-如何根据另一个属性限制一个属性的数据输入?,sql,sql-server,sql-server-2012,ddl,Sql,Sql Server,Sql Server 2012,Ddl,下面是我要创建的表的DDL。但是,我希望属性“专长\品种”从“专长\动物”派生而来。例如,如果“狗”被输入到“动物”中,我不想进入猫的品种。我将如何实现这一目标? 我正在与SQL Server Management Studio 2012合作 CREATE TABLE tExpertise ( Expertise_ID int NOT NULL PRIMARY KEY, --E.G Data '001' Expertise_type varchar(8)

下面是我要创建的表的DDL。但是,我希望属性“专长\品种”从“专长\动物”派生而来。例如,如果“狗”被输入到“动物”中,我不想进入猫的品种。我将如何实现这一目标? 我正在与SQL Server Management Studio 2012合作

CREATE TABLE tExpertise
(
Expertise_ID        int         NOT NULL  PRIMARY KEY, --E.G Data '001'
Expertise_type      varchar(8)  NOT NULL,              --E.G Data 'Domestic'
Expertise_animal    varchar(30) NOT NULL,              --E.G Data 'Dog'
Expertise_breed     varchar(30) NOT NULL               --E.G Data 'Poodle'
)

您可以在insert和/或update时创建触发器,并为每行比较这两列。您可以通过“插入”别名引用插入的条目


如果您知道允许哪些映射(例如dog x poodle),您可以将其存储在某个表中,并在insert中连接到它以过滤出错误的映射

这是一种关系数据情况,您应该使用关系表

我想要三个 动物分类-(家养、野生、其他) 动物种类(狗、猫、山羊) 动物品种(贵宾犬、小猎犬) 动物物种将具有动物分类的外键,即。 狗-家养 动物品种将具有动物物种的外键,即。
Beagle-dog

从理论上讲,您想要的东西可以通过使用表级别来实现,实现这一点的一般方法如下(未经测试):

虽然这可能会对您有所帮助,但不建议将这种复杂的验证放在数据库级别。复杂的验证应该(至少)在应用程序的业务层中实现,通常在(通常是ASP.NET MVC、WCF服务、Web服务等)中实现(一些验证也放在表示层中,以避免往返时间延迟

数据库主要用于数据持久性和获取。当然,欢迎使用简单的约束,如
FK
s、
unique
约束、列级约束等,因为它们是一个良好的安全网


此外,请记住,上面提到的约束将触发表中的每一次
插入
更新
,并可能严重降低涉及大量记录的查询的性能。

您想如何教导SQL Server
贵宾狗
确实是一只
狗创建检查约束该检查约束看起来像一个小数据库。添加一个检查约束,如
constraint AK_tExpertise_unique unique(专家类型、专家动物、专家品种)如何
?但问题仍然存在:您想如何教导SQL Server一个
bat
不是
bird
?您可以硬编码它。但是,您也可以用所有可能的/可接受的组合预先填充列表,否则一个人将不得不验证新条目,您只需在末尾添加一个
IsVerified
位并要求用户验证数据。这取决于约束的复杂程度。通常,如果约束简单,请使用检查约束。如果约束复杂,则需要使用触发器。
CREATE FUNCTION dbo.validateExpertise(
    @expertise_type varchar(8),
    @Expertise_animal varchar(30),
    @Expertise_breed varchar(30)   
)
RETURNS BIT
AS
BEGIN
    IF (@Expertise_animal == 'dog' AND @Expertise_breed != 'dog') 
        RETURN 0;

    -- other validations can come here

    RETURN 1;
END
GO

-- add a table level constraint
-- WITH NOCHECK can be used to not check existing data
ALTER TABLE detailTable ADD CONSTRAINT chkExpertise
        CHECK (dbo.validateExpertise(expertise_type, Expertise_animal, Expertise_breed) = 1)