在 SQL Server 上,不可为空的 varchar 列可以包含空字符串。
在 ORACLE 下它们不能,因为 varchar2 将 '' 视为等同于 NULL。
如果您设计的数据库架构适用于两个 RDBMS,那么向 SQL Server 上的每个不可为 null 的 varchar 列添加一个不允许空字符串的约束似乎是个好主意。
但哪种方法是制定这种约束的最佳方式?
我开始了
if OBJECT_ID('varchar_without_empty_cols') > 0 drop table varchar_without_empty_cols
go
create table varchar_without_empty_cols (
id int ,
val varchar(10) not null CHECK (val <> '')
)
go
insert into varchar_without_empty_cols values (1, ' ') -- this ought be OK
go
insert into varchar_without_empty_cols values (2, '') -- this has to violate the check
go
insert into varchar_without_empty_cols …Run Code Online (Sandbox Code Playgroud) 我们想使用两个不同的表,一个将在“活动”时保存一个对象,另一个将在它变为“非活动”时保存该对象。因此,每个表(组合)的 ID 都是唯一的。我们如何为 ID 创建一个约束,使得 ID 在两个表中只出现一次?
我们正在使用 SQL Server。
我正在 Microsoft SQL Server 2005 上开发企业培训预订系统的第二个版本。
我有 3 个表(针对这个问题进行了简化)。
表 1 - CourseSize表- 这决定了能够预订会话的最大参与者数量。
表 2 - 课程 - 要提供的课程、日期/时间和对 CourseSize 记录的引用。
表 3 - 预订表- 参考相关会话记录进行预订的人。
SQL如下-
CREATE TABLE [dbo].[CourseSize]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[CourseSizeMax] [tinyint] NOT NULL,
CONSTRAINT [PK_CourseSize] PRIMARY KEY CLUSTERED ([ID] ASC)
);
CREATE TABLE [dbo].[Session]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[CourseSizeID] [int] NOT NULL,
CONSTRAINT [PK_Session] PRIMARY KEY CLUSTERED ([ID] ASC)
);
GO
ALTER TABLE [dbo].[Session] WITH CHECK …Run Code Online (Sandbox Code Playgroud) 我对 Oracle 和数据库世界很陌生。我不确定标题是否有意义,所以我会继续解释我的情况。
我目前手头有一张记录订单交易的表。此表中的列是 TRANSACTION_TYPE、ORDER_ID、QUANTITY、DATE、CREATED_BY、CREATION_DATE。交易类型是“购买”和“退款”。到目前为止,我们只有全额退款,因为购买的大部分商品都是单一数量。我们希望使它成为多个,在这种情况下,我们可能不得不执行多次退款。
表唯一键约束是 TRANSACTION_TYPE、ORDER_ID 的组合。我可以打破这个限制,通过将组合扩展到 TRANSACTION_TYPE、ORDER_ID、TRANSACTION_REFERENCE(这个引用来自于进行实际购买或退款的服务)来进行多次退款。但事情是这样的,这意味着我可以对同一个订单进行多次退款,如果是购买也是可能的。我想创建一个约束,使得 'PURCHASE' + ORDER_ID 的组合在表中是唯一的,这样对于给定的 ORDER_ID 约束只能进行一次购买。
我试着寻找这种可能性,甚至在这个网站上尝试过。我可能在这里使用了错误的术语。但是,如果这里有人对此有答案,我很乐意听到。
任何帮助甚至将我推向正确方向的帮助都将不胜感激。
假设我有一个包含数据 A1 和 A2 的表 tbl1,其中 A1 是主键。然后我有另一个表 tbl2,其中包含数据 A3 和 A1,两者一起作为主键,将 A1 引用为来自 tbl1 的外键。
我可以在 tbl2 中插入一个元组,它的 A1 不在 tbl1 中吗?SQL 是否将其作为错误来管理?或者在这种情况下会发生什么?
假设我有下表:
CREATE TABLE test(test_id int not null identity primary key,
field1 int not null,
field2 int
);
CREATE INDEX IDX_test_field1 ON test(field1);
CREATE INDEX IDX_test_field2 ON test(field2);
Run Code Online (Sandbox Code Playgroud)
现在ALTER TABLE test ALTER COLUMN field1 int工作,并field1允许null.
尽管如此,我无法改变,ALTER TABLE test ALTER COLUMN field2 int not null因为
ALTER TABLE ALTER COLUMN field2 失败,因为一个或多个对象访问此列。
此外,我无法改field1回not null.
但是,我可以根据需要多次添加然后删除检查约束:
ALTER TABLE test ADD CONSTRAINT CHK_NN_field2 CHECK (field2 IS NOT NULL);
DROP CONSTRAINT CHK_NN_field2` without any …Run Code Online (Sandbox Code Playgroud) 我有一个定义关系的表
Src smallint(5) unsigned NOT NULL,
Dst smallint(5) unsigned NOT NULL,
other fields
Run Code Online (Sandbox Code Playgroud)
我需要添加一个约束,说明其中一列中是否存在给定值。
1) 不能在同一列中重复。
2) 也不能在其他列中重复。
这是无效的
src dst
1 354
666 1
Run Code Online (Sandbox Code Playgroud)
由于值 1 出现在第一行中,因此它不能出现在第二行中。
如何定义这种类型的约束?
我正在对应用程序杠杆进行轻量级检查。但我希望数据库确保它。
更新:目前我有 7 种不同类型的关系,每种关系类型一张表。
更新 2:原来这只是一张包含所有关系的表,现在我要爆炸了
# variante
Create TABLE `productsRelationships3` (
`relSrc` smallint(5) unsigned NOT NULL,
`relDst` smallint(5) unsigned NOT NULL,
PRIMARY KEY `src-dst-3` (relSrc, relDst),
UNIQUE `src-3` (relSrc)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# this is the import
INSERT INTO productsRelationships3 SELECT relSrc, relDst FROM productsRelationships WHERE relType=3;
DELETE FROM …Run Code Online (Sandbox Code Playgroud) MySQL 提供了暂时禁用外键检查的能力,从而允许不一致的数据进入数据库。
是否可以逐表、逐行检查整个 MySQL 数据库,以确保满足所有约束?
鉴于以下 CREATE TABLE 语句:
CREATE TABLE [dbo].[Unit]
(
[id] SMALLINT NOT NULL IDENTITY(1,1),
[name] VARCHAR(100) NOT NULL,
CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [UQ_Unit_Name] UNIQUE ([name])
)
Run Code Online (Sandbox Code Playgroud)
如何在不违反 UNIQUE 约束的情况下允许以下两个字符串共存?
INSERT INTO dbo.Unit (Name) VALUES('e³m³/day')
INSERT INTO dbo.Unit (Name) VALUES('e3m3/day')
Run Code Online (Sandbox Code Playgroud)
任何见解表示赞赏。
编辑
当前整理是 Latin1_General_CI_AS
编辑
除非有人有更好的选择,否则我似乎必须使用 Latin1_General_BIN 并在我需要的几个地方手动处理 CI……如果没有提供更好的解决方案,我会将其转换为答案。
sql-server constraint sql-server-2008-r2 string unique-constraint
我正在尝试使用 oracle 对这样的事情进行建模:
一个账号可以有1~5个成员
所以我将有一个帐户表和一个带有帐户 FK 的成员表。但是可以检查帐户的成员是否少于 5 人吗?
我已经尝试过约束和触发器,但 oracle 不允许在约束或触发器条件中进行子查询,例如
CHECK( SELECT ...) 或者 IF count(*) >= 5
这让事情变得困难。