English 中文(简体)
如何在 SQL 服务器上设置这种限制?
原标题:How to make this kind of constraint in SQL Server?

Let s say have have two tables, A and B.
A contains fields: id, a1, a2.
B contains fields: id, b1, b2.

根据id 字段,从表A到表B,假设从一到许多关系。

现在让我们说,我想在表b上设置一个独特的限制,禁止我插入基于b1、b2和a1的重复记录。

最佳回答

您必须有一个 a1 副本出现在 > a1 中, 才能强制执行这个限制。 如果您不想让用户看到这个限制。 如果您不想让用户看到这个限制, 您将创建一个包含所有 B 列+ a1 的表格( code > B 列+ a1 的表格), 然后创建一个视图( 以合适的插入按钮来弹射 a1 ), 称为 B , 隐藏这个列的表格( code > 。

您还应该在 A a1 上创建一个 A 的超级密钥,并使用从 B 上到这两个列上的外国密钥限制(可能使用 ON UPDATE CASCADE ),以确保复制的列正确匹配 A 中的相应值。

您然后决定这是唯一的外国密钥, 还是继续维持“ 正确” 密钥( 仅 < code> id ) 是一个口味问题 。


例如:

CREATE TABLE dbo.A (ID int not null,a1 int not null,a2 int not null,
    constraint PK_A PRIMARY KEY (id),
    constraint UQ_A_a1_check UNIQUE (id,a1)
)
CREATE TABLE dbo._B (ID int not null,a1 int not null,b1 int not null,b2 int not null,
    constraint PK_B PRIMARY KEY (a1,b1,b2),
    constraint FK_B_A FOREIGN KEY (id) references A (id),
    constraint DRI_B_A_a1_check FOREIGN KEY (id,a1) references A (id,a1) on update cascade
)
GO
CREATE VIEW dbo.B
WITH SCHEMABINDING
AS
    select id,b1,b2 from dbo._B
GO
CREATE TRIGGER T_B_I on dbo.B instead of insert
AS
    INSERT INTO dbo._B (id,a1,b1,b2)
    SELECT i.id,a.a1,i.b1,i.b2
    FROM
       inserted i
          inner join
       dbo.A a
          on
             i.id = a.id
GO
问题回答

一种解决办法可以是为表A中的重复值创建一个函数测试,并添加一个检查限制,将该函数指向表B。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

难以执行 REGEXP_SUBSTR

I m 查询Oracle 10g。 我有两张表格(样本数据见下文)。 i m 试图提取一些领域

SQL Query Shortcuts

What are some cool SQL shorthands that you know of? For example, something I learned today is you can specify to group by an index: SELECT col1, col2 FROM table GROUP BY 2 This will group by col2

PHP array callback functions for cleaning output

I have an array of output from a database. I am wondering what the cleanest way to filter the values is example array Array ( [0] => Array ( [title] => title 1 ...

OracleParameter and DBNull.Value

we have a table in an Oracle Database which contains a column with the type Char(3 Byte). Now we use a parameterized sql to select some rows with a DBNull.Value and it doesn t work: OracleCommand ...

Running numbers in SQL

I have a SQL-statement like this: SELECT name FROM users WHERE deleted = 0; How can i create a result set with a running number in the first row? So the result would look like this: 1 Name_1 2 ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...

热门标签