在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]有什么问题?如何解决?

错误消息是因为您在计算列上放置了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本身的计算字段是浪费资源:不应存在两个字段中的一个
-我会不惜一切代价避免使用带有系统函数名称(userid)的字段
-这个问题看起来像是试图为隐藏的问题制定一个解决方案(计算字段为id)。

很抱歉我的误解,所以你想在一个表中添加两列的自动增量。事实上,这在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
)

列别名适用于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],请考虑使用触发器。

最新更新