一个表可以在SQL Server中有两个标识列吗?

时间:2015-11-12 02:25:56

标签: sql sql-server

我正在尝试将两列自动增加,但此列显示错误[user_id] as id + 0 PRIMARY KEY NOT NULL

  

只能在计算列上创建UNIQUE或PRIMARY KEY约束

我想要做的是,如果id = 1,也使user_id = 1。

CREATE TABLE [dbo.TBL_TXN_USER]
(
    [id]                int  NOT NULL IDENTITY(1,1),
    [user_id] as id + 0 PRIMARY KEY NOT NULL ,
    [username]          varchar(150)    NOT NULL,
    [fullname]          varchar(150)    NOT NUll,
    [pwd]               varchar(50)     NOT NUll,
    [email]             varchar(150)    NOT NULL,
    [mobile]            varchar(150)    NOT NULL,
    [designation]       varchar(150)    NOT NULL,
    [deleted]           int             NULL,
    [created_date]      datetime        NULL,
    [creator_user_id]   int             NULL,
    [changed_date]      datetime        NULL,
    [changer_user_id]   int             NULL,
    [add_content]       int              NULL,
    [edit_content]      int              NULL,
    [delete_content]    int              NULL,
    [manage_user]       int              NULL,
    [view_log]          int              NULL,  
)

[user_id]有什么问题?怎么解决?

3 个答案:

答案 0 :(得分:1)

很抱歉我的误解,所以你想在一个表中添加两列自动增量。实际上这在SQL服务器上是不可接受的,所以我将在下面给你另一个选项

CREATE TRIGGER [dbo].[insert_triger] ON [dbo].[TBL_TXN_USER]
FOR INSERT
AS
update TBL_TXN_USER set [user_id] = id
where id = (
  select MAX(id)
  from TBL_TXN_USER
)

答案 1 :(得分:1)

错误消息是因为您在计算列上放置了NOT NULL约束 在sql server 2012上,完整的错误消息是:

  

只能在计算上创建UNIQUE或PRIMARY KEY约束   列,而CHECK,FOREIGN KEY和NOT NULL约束需要   计算列必须保持不变。

这是一个工作脚本(我更改了表名):

CREATE TABLE dbo.[TBL_TXN_USER]
(
    [id]                int  NOT NULL IDENTITY(1,1),
    [user_id]           as id + 0 persisted not null primary key,
    [username]          varchar(150)    NOT NULL,
    [fullname]          varchar(150)    NOT NUll,
    [pwd]               varchar(50)     NOT NUll,
    [email]             varchar(150)    NOT NULL,
    [mobile]            varchar(150)    NOT NULL,
    [designation]       varchar(150)    NOT NULL,
    [deleted]           int             NULL,
    [created_date]      datetime        NULL,
    [creator_user_id]   int             NULL,
    [changed_date]      datetime        NULL,
    [changer_user_id]   int             NULL,
    [add_content]       int              NULL,
    [edit_content]      int              NULL,
    [delete_content]    int              NULL,
    [manage_user]       int              NULL,
    [view_log]          int              NULL,  
);
GO

我对这个问题有几点评论 - 具有固定公式的计算字段,其中静态值作为主键而不是id本身是浪费资源:2个字段中的一个不应该在那里
- 一个具有系统功能名称(user_id)的字段是我不惜一切代价避免的 - 这个问题看起来像是试图为隐藏的问题提供解决方案(计算字段为id)。

答案 2 :(得分:0)

列别名适用于select语句而不是create table,也适用于[user_id]您未提供任何数据类型的语句。 使用以下命令创建表:

CREATE TABLE [dbo.TBL_TXN_USER](
[id]                int  NOT NULL IDENTITY(1,1),
[user_id]         int PRIMARY KEY NOT NULL  ,
....rest of code

要更新[user_id],请考虑使用触发器。