小编ber*_*d_k的帖子

什么时候应该使用唯一约束而不是唯一索引?

当我希望一列具有不同的值时,我可以使用约束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
Run Code Online (Sandbox Code Playgroud)

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);
Run Code Online (Sandbox Code Playgroud)

具有唯一约束的列似乎是唯一索引的良好候选者。

是否有任何已知的原因使用唯一约束而不是使用唯一索引?

index sql-server constraint best-practices unique-constraint

238
推荐指数
4
解决办法
11万
查看次数

如何使用 SELECT INTO 复制表但忽略 IDENTITY 属性?

我有一个带有标识列的表说:

create table with_id (
 id int identity(1,1),
 val varchar(30)
);
Run Code Online (Sandbox Code Playgroud)

众所周知,这

select * into copy_from_with_id_1 from with_id;
Run Code Online (Sandbox Code Playgroud)

导致 copy_from_with_id_1 在 id 上也带有标识。

以下堆栈溢出问题提到明确列出所有列。

咱们试试吧

select id, val into copy_from_with_id_2 from with_id;
Run Code Online (Sandbox Code Playgroud)

糟糕,即使在这种情况下 id 也是一个标识列。

我想要的是一张像

create table without_id (
 id int,
 val varchar(30)
);
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server identity

45
推荐指数
4
解决办法
6万
查看次数

为什么 Denali 序列应该比身份列表现更好?

在他对哪个更好的回答中:标识列还是生成的唯一 id 值?mrdenny 说:

当 SQL Denali 出现时,它将支持比身份更高效的序列,但您无法自己创建更高效​​的东西。

我不确定。知道 Oracle 的序列后,我要么为插入创建触发器,将每个插入封装到存储过程的调用中,要么祈祷我在执行临时插入时不要忘记正确使用序列。

我怀疑序列的优势是否如此明显。

sql-server sequence sql-server-2012

36
推荐指数
2
解决办法
4003
查看次数

“避免基于递增键创建聚集索引”是 SQL Server 2000 天以来的神话吗?

我们的数据库由许多表组成,其中大多数使用整数代理键作为主键。这些主键中约有一半位于标识列上。

数据库开发始于 SQL Server 6.0。

从一开始就遵循的规则之一是,避免根据递增键创建聚集索引,正如您在这些索引优化技巧中找到的那样。

现在使用 SQL Server 2005 和 SQL Server 2008,我强烈的印象是情况发生了变化。同时,这些主键列是表的聚集索引的完美首选。

sql-server-2005 sql-server clustered-index

22
推荐指数
3
解决办法
4675
查看次数

如何在 SQL Server DDL 中使用事务?

我有一个登录表,所有插入都由一个存储过程完成。

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(1, 1) NOT NULL,
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log PRIMARY KEY CLUSTERED  (LogRefnr)
)
go


Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
    Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
    Values  (@Query, @time, @duration, @SessinID);
end;
GO
Run Code Online (Sandbox Code Playgroud)

目前该表中大约有 45500000 行,我想将日志记录定向到不同的表。

我的想法是使用以下脚本

begin Transaction

exec sp_rename LogTable, LogTableOld;

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 transaction ddl

22
推荐指数
1
解决办法
1万
查看次数

如何仅捕获和处理特定的 Oracle 异常?

这个这个我猜,ORA-00955 没有预定义的命名系统异常。

如何重写以下内容以仅捕获错误 ORA-00955?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?

oracle exception

22
推荐指数
2
解决办法
7万
查看次数

如何摆脱密码将在 6 天内过期的 ORA-28002 消息?

我有一个用户收到一个 ORA-28002,表明密码将在六天内过期。我运行了以下内容:

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 
Run Code Online (Sandbox Code Playgroud)

但是当我尝试以用户身份登录时,该消息仍然存在。执行这个:

select * from dba_profiles where RESOURCE_NAME LIKE 'PASSWORD_LIFE_TIME';
Run Code Online (Sandbox Code Playgroud)

显示这些值确实更改为 UNLIMITED。

oracle security

21
推荐指数
4
解决办法
9万
查看次数

我可以更改 Oracle 数据库的 SID 吗?

服务器为 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit

是否有一种简单快捷的方法来更改服务器上测试数据库的 SID?

删除和重新创建数据库对我来说是一个选择。但我正在寻找需要更少时间的东西。

在客户端 tnsnames.ora 中分配名称的另一个选项容易出错,因为它们不是集中管理的。

与在 SQL-Server 上删除和创建数据库的时间相比,创建新的 Oracle 数据库所需的时间要多得多。进一步在 SQL-Server 上,您可以重命名 SQL-Server 实例。[通常您重命名运行 SQL-Server 的服务器并且在重命名服务器之前会遇到一些问题]。

oracle oracle-11g linux

20
推荐指数
3
解决办法
8万
查看次数

Oracle 的 VARCHAR 和 VARCHAR2 数据类型之间有什么区别?

将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)字段替换为VARCHAR2(n)字段(前提是 n <= 4000)。

为什么 Oracle 称这种数据类型VARCHAR2而不是VARCHAR像其他 DBMS 一样?

oracle datatypes

20
推荐指数
2
解决办法
2万
查看次数

我可以从脚本内部启用 SQLCMD 模式吗?

是否有类似指令可以在脚本中使用以强制 SSMS 启用/禁用 SQLCMD 模式?

sql-server sqlcmd

19
推荐指数
2
解决办法
3万
查看次数