当我希望一列具有不同的值时,我可以使用约束
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
我有一个带有标识列的表说:
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) 在他对哪个更好的回答中:标识列还是生成的唯一 id 值?mrdenny 说:
当 SQL Denali 出现时,它将支持比身份更高效的序列,但您无法自己创建更高效的东西。
我不确定。知道 Oracle 的序列后,我要么为插入创建触发器,将每个插入封装到存储过程的调用中,要么祈祷我在执行临时插入时不要忘记正确使用序列。
我怀疑序列的优势是否如此明显。
我们的数据库由许多表组成,其中大多数使用整数代理键作为主键。这些主键中约有一半位于标识列上。
数据库开发始于 SQL Server 6.0。
从一开始就遵循的规则之一是,避免根据递增键创建聚集索引,正如您在这些索引优化技巧中找到的那样。
现在使用 SQL Server 2005 和 SQL Server 2008,我强烈的印象是情况发生了变化。同时,这些主键列是表的聚集索引的完美首选。
我有一个登录表,所有插入都由一个存储过程完成。
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) 从这个和这个我猜,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)
顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?
我有一个用户收到一个 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 Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit
是否有一种简单快捷的方法来更改服务器上测试数据库的 SID?
删除和重新创建数据库对我来说是一个选择。但我正在寻找需要更少时间的东西。
在客户端 tnsnames.ora 中分配名称的另一个选项容易出错,因为它们不是集中管理的。
与在 SQL-Server 上删除和创建数据库的时间相比,创建新的 Oracle 数据库所需的时间要多得多。进一步在 SQL-Server 上,您可以重命名 SQL-Server 实例。[通常您重命名运行 SQL-Server 的服务器并且在重命名服务器之前会遇到一些问题]。
将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)字段替换为VARCHAR2(n)字段(前提是 n <= 4000)。
为什么 Oracle 称这种数据类型VARCHAR2而不是VARCHAR像其他 DBMS 一样?
是否有类似指令可以在脚本中使用以强制 SSMS 启用/禁用 SQLCMD 模式?
sql-server ×5
oracle ×4
constraint ×1
datatypes ×1
ddl ×1
exception ×1
identity ×1
index ×1
linux ×1
oracle-11g ×1
security ×1
sequence ×1
sqlcmd ×1
transaction ×1