Questions tagged «constraint»

一种声明性机制,例如检查或外键,用于在数据库中强制执行某些数据完整性规则。

3
使字段唯一会使索引吗?
如果unique对字段进行约束,是否还需要在该字段上建立索引才能获得可伸缩的插入时间?或者这是为我完成的(即使它使用的索引不能公开访问?) 具体来说,我正在与Apache Derby一起进行原型设计,尽管我可能会在不久的将来将其移至MySQL。我也希望SQL标准中可能有一些说明。 我将永远不需要按此字段进行搜索,因此我宁愿不要创建无用的索引。但是我宁愿使用无用的索引也不愿使用O(n)插入时间。

2
为什么复合外键需要单独的唯一约束?
这是一个简单的表,其中的记录可以引用同一表中的父记录: CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); 在附加要求下,num父记录和子记录之间的其他字段值之一必须相同,我认为应该使用复合外键来解决问题。我将最后一行更改为 FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) 并得到错误:没有唯一的约束条件匹配给定表“ foo”的键。 我可以轻松添加此约束,但是当所引用的列(id)中的一个已被保证是唯一的时,我不明白为什么有必要这样做?从我的角度来看,新约束将是多余的。

6
具有层次结构的表:创建约束以防止通过外键实现圆度
假设我们有一个对其自身具有外键约束的表,如下所示: CREATE TABLE Foo (FooId BIGINT PRIMARY KEY, ParentFooId BIGINT, FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) ) INSERT INTO Foo (FooId, ParentFooId) VALUES (1, NULL), (2, 1), (3, 2) UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1 该表将具有以下记录: FooId ParentFooId ----- ----------- 1 3 2 1 3 2 在某些情况下,这种设计可能是有道理的(例如,典型的“雇员与老板-雇员”关系),无论如何:在我的方案中有这种情况。 …

3
列出索引和约束
我正在查看我继承的应用程序的SQL Server数据库。我已经有大约10年没有研究SQL Server了,所以请多多包涵。 我正在查看的数据库表有一个bigint NOT NULL名为的列id,但是,当我检查约束时,没有看到任何约束,所有数据库表也是如此。 我是否假设这些表上没有主键并且没有索引(聚集或非聚集),对吗? 我运行了以下查询,结果似乎证实了我的怀疑: //**returns 0** select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS; //**returns no rows** select * from sys.indexes where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE'); //**returns all tables in database** SELECT name FROM sys.tables WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;

1
MySQL:大列的唯一约束
我正在尝试创建一个InnoDB表,该表包含VARCHAR最多可容纳3071个字符的列。我想UNIQUE对该列的数据施加约束。 MySQL似乎使用索引来强制执行约束。在InnoDB中,索引大小似乎被限制为767个字节-不足以VARCHAR(3071)容纳存储数据的列。 关于如何在不影响最大数据长度或使用InnoDB的情况下如何使数据库强制数据唯一性的想法?

2
SQL Server相当于Oracle USING INDEX子句
在Oracle中是否有与USING INDEX子句等效的SQL Server 2008?专门针对构造: CREATE TABLE c(c1 INT, c2 INT); CREATE INDEX ci ON c (c1, c2); ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci; 在有关唯一索引的Sql Server 文档中,它指出了(强调): 唯一索引通过以下方式实现: 主键或唯一约束 创建PRIMARY KEY约束时,如果表上的聚簇索引尚不存在并且未指定唯一的非聚簇索引,则会在一个或多个列上自动创建一个唯一的聚簇索引。主键列不能使用NULL值。 这似乎暗示着有一种方法可以指定应将哪个索引用于主键。

2
如何帮助SQL Server识别我的索引视图列不可为空?
我在SQL Server 2008中定义了以下索引视图(您可以从gist下载工作架构以进行测试): CREATE VIEW dbo.balances WITH SCHEMABINDING AS SELECT user_id , currency_id , SUM(transaction_amount) AS balance_amount , COUNT_BIG(*) AS transaction_count FROM dbo.transactions GROUP BY user_id , currency_id ; GO CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id ON dbo.balances ( user_id , currency_id ); GO user_id,currency_id和transaction_amount都定义为中的NOT NULL列dbo.transactions。但是,当我看着Management Studio中的对象资源管理器,它标志着这两个视图定义balance_amount,并transaction_count为NULL在视图-able列。 我看了几个讨论,其中最相关的讨论表明一些功能改组可以帮助SQL Server识别视图列始终为NOT NULL。不过,在我的情况下,这样的改组是不可能的,因为在索引视图中不允许使用聚合函数的表达式(例如ISNULL()over SUM())。 …

5
互斥的多对多关系
我有一个表containers,可以有几个表一个多一对多的关系,让我们说那些是plants,animals和bacteria。每个容器可以包含任意数量的植物,动物或细菌,并且每个植物,动物或细菌可以位于任意数量的容器中。 到目前为止,这非常简单,但是我遇到的问题是每个容器应仅包含相同类型的元素。例如包含植物和动物的混合容器应成为数据库中的约束违例。 我的原始模式如下: containers ---------- id ... ... containers_plants ----------------- container_id plant_id containers_animals ------------------ container_id animal_id containers_bacteria ------------------- container_id bacterium_id 但是使用这种模式,我无法提出如何实现容器应该是同质的约束。 有没有一种方法可以使用参照完整性来实现这一点,并确保在数据库级别上容器是同质的? 我为此使用Postgres 9.6。

3
如何创建具有相同约束和索引的新表?
我正在创建一个具有主键约束和该表中的非聚集索引的新表。 我知道,我想创建另一个具有相同结构和值以及键和索引的表。 create table Dummy (id integer ,name varchar(20),salary integer Constraint PK_Con_id primary key(id)) insert into Dummy values(11,'AAA',1000); insert into Dummy values(12,'BBB',2000); insert into Dummy values(13,'CCC',3000); insert into Dummy values(14,'DDD',4000); select * from Dummy; create nonclustered index IX_Name on Dummy(Name) 现在,我正在创建Dmy表,但是“键和约束”未反映Dmy在SQL Server 2008 R2的表中。 SELECT * INTO Dmy FROM Dummy

2
交易,参考资料以及如何执行双重记账?(PG)
两次入境簿记是 一套用于在财务会计系统中记录财务信息的规则,其中每个交易或事件都会更改至少两个不同的名义分类帐。 帐户可以是“借方”或“贷方”,所有贷方的总和必须等于所有借方的总和。 您将如何在Postgres数据库中实现这一点?指定以下DDL: CREATE TABLE accounts( account_id serial NOT NULL PRIMARY KEY, account_name varchar(64) NOT NULL ); CREATE TABLE transactions( transaction_id serial NOT NULL PRIMARY KEY, transaction_date date NOT NULL ); CREATE TABLE transactions_details( id serial8 NOT NULL PRIMARY KEY, transaction_id integer NOT NULL REFERENCES transactions (transaction_id) ON UPDATE …

3
SQL为列设置允许的值
我想做一个ALTER TABLE表达式,添加一个新列并设置一个默认值,另外定义该列的允许值。它是一个文本列,并且只能是“ value1”,“ value2”和“ value3”。默认值应为“ value1” 根据以下语法图: 我到了这一点 ALTER TABLE exampleTable ADD COLUMN new_column VarChar(20) DEFAULT 'value1' 但我绝对不确定如何设置允许的值。 有可能使像 约束检查new_column IN('value1','value2','value3) ?我必须承认该search condition图使我感到困惑。

1
如何在SQL Server中创建与非主键的关系?
我有一个用户表,该表有两列,分别是主键UserID和另一列UserName。 UserID(int)PK 用户名(varchar(256) 它们都是唯一的,但出于某些原因,我决定将UserName用作其他表中的引用。因此,例如,订单表通过UserName而不是userid引用了user。 订单编号 用户名 我想在所有引用UserName和Users表的表之间建立一种关系,以便获得SQL Server的级联更新/删除功能。 但是SQL Server不允许我在非主键列上创建关系。有什么方法可以在不更改用户表的情况下获得级联更新/删除功能,以便UserName是主键而不是UserID?

6
围绕唯一索引最大16列的任何方式
根据CREATE INDEX文档: 单个组合索引键最多可以组合16列。 我们有一个约18列的表格,需要形成一个唯一的组合。该表对性能不敏感-我们很少更新值/插入记录。我们只需要确保避免重复记录即可...并认为我们可以施加一个简单的唯一性约束。 有任何想法吗?如果有更好的方法,我愿意完全避免使用唯一的索引/约束。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.