Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入表时如何填充标识列?_Sql_Sql Server - Fatal编程技术网

Sql 插入表时如何填充标识列?

Sql 插入表时如何填充标识列?,sql,sql-server,Sql,Sql Server,我有一个表,它的数据是通过从另一个表中选择来插入的。比如说, CREATE TABLE TestTable (ID int, FirstName VARCHAR(100), LastName VARCHAR(100)) INSERT INTO TestTable (FirstName, LastName) SELECT FirstName, LastName FROM Person.Contact 但是如何填充ID呢?我试过了 INSERT INTO TestTable (SCOPE_IDE

我有一个表,它的数据是通过从另一个表中选择来插入的。比如说,

CREATE TABLE TestTable (ID int, FirstName VARCHAR(100), LastName VARCHAR(100))

INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
但是如何填充ID呢?我试过了

INSERT INTO TestTable (SCOPE_IDENTITY()+1, FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
我不想将ID设为标识列,因为我复制了现有的表结构,该表结构的ID为常规列


但它不起作用。有什么想法吗?

他们说得对,你应该指定一个自动编号列。详情如下:

CREATE TABLE TestTable 
    (
    ID int NOT NULL IDENTITY (1, 1),
    Firstname varchar(100) NULL,
    Lastname varchar(100) NULL
    )  
然后,在插入时,请使用以下命令:

DECLARE @MyTableVar table( ID int);
INSERT INTO TestTable
    OUTPUT INSERTED.ID
        INTO @MyTableVar
SELECT FirstName, LastName
FROM Person.Contact;

然后为插入的标识选择@MyTableVar,因为它们是正确的,您应该指定一个自动编号列。详情如下:

CREATE TABLE TestTable 
    (
    ID int NOT NULL IDENTITY (1, 1),
    Firstname varchar(100) NULL,
    Lastname varchar(100) NULL
    )  
然后,在插入时,请使用以下命令:

DECLARE @MyTableVar table( ID int);
INSERT INTO TestTable
    OUTPUT INSERTED.ID
        INTO @MyTableVar
SELECT FirstName, LastName
FROM Person.Contact;

然后为插入的标识选择@MyTableVar,这取决于您使用的确切SQL server,但由于它看起来您使用的是Microsoft SQL server:

仅仅将列标记为
ID
是不够的。您需要确保在SQL Server中将
ID
列标记为标识列。这类似于在PostgreSQL中标记列
SERIAL
,或在MySQL中标记列
AUTOINCREMENT
。确保你先做了这件事

假设您已经这样做了,只需让数据库本身通过在
INSERT
语句中显式地不引用该列来添加标识值即可。因此

INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact

而依靠SQL Server的底层身份支持来为您填充它将很好地工作。从您的示例来看,您缺少的是首先将
ID
列标记为标识列。

这取决于您使用的确切SQL server,但由于它看起来您使用的是Microsoft SQL server:

仅仅将列标记为
ID
是不够的。您需要确保在SQL Server中将
ID
列标记为标识列。这类似于在PostgreSQL中标记列
SERIAL
,或在MySQL中标记列
AUTOINCREMENT
。确保你先做了这件事

假设您已经这样做了,只需让数据库本身通过在
INSERT
语句中显式地不引用该列来添加标识值即可。因此

INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact

而依靠SQL Server的底层身份支持来为您填充它将很好地工作。从您的示例来看,您缺少的是首先将
ID
列标记为标识列。

是否在您要查找的内容下方

挑选 id+0 ,姓 ,姓 进入测试表
来自个人。联系人是否低于您要查找的内容

挑选 id+0 ,姓 ,姓 进入测试表
从Person.Contact

主键是否设置为自动递增?因为这样您就不需要在insert语句中添加主键字段了/您不能将ID定义为autoinc吗?您正在使用什么RDBMS?主键是否设置为自动递增?因为这样您就不需要在insert语句中添加主键字段了/您不能将ID定义为autoinc吗?您正在使用什么RDBMS?我尝试用@@IDENTITY替换SCOPE_IDENTITY()+1,但在将varchar转换为数据类型numeric时出现算术溢出错误。我尝试用@@IDENTITY替换SCOPE_IDENTITY()+1,但在将varchar转换为数据类型numeric时出现算术溢出错误。