注册 登录
编程论坛 SQL Server论坛

当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值。

jianghong_02 发布于 2010-10-09 19:36, 9035 次点击
USE master
GO
IF EXISTS (SELECT * FROM sysdatabases WHERE name='stuDB')
DROP DATABASE stuDB
CREATE DATABASE  stuDB
ON PRIMARY
( NAME='stuinfo',
  FILENAME='D:\project\stuinfo.mdf',
  SIZE=3,
  MAXSIZE=10,
  FILEGROWTH=15%

)

GO
USE stuDB
GO
CREATE TABLE stuinfo
(stuName CHAR(32) NOT NULL,--学生姓名
 stuNO   CHAR(8)  NOT NULL,--学号
 stuSex  bit      NOT NULL,--性别
 stuAge  int      NOT NULL,--年龄
 stuSeat  SMALLINT IDENTITY (1,1)    NOT NULL,--座位号,采用自动编号方式,且必须是1~30号
 stuAddress  TEXT          --学生地址
  
)
      --添加控制
GO
ALTER TABLE stuinfo
ADD CONSTRAINT PK_stuName PRIMARY KEY (stuName)
ALTER TABLE stuinfo
ADD CONSTRAINT UQ_stuNo  UNIQUE      (stuNo)
ALTER TABLE stuinfo
ADD CONSTRAINT UQ_stuSex  UNIQUE      (stuSex)
ALTER TABLE stuinfo
ADD CONSTRAINT CK_stuAge  CHECK      (stuAge BETWEEN 15 AND 40)
ALTER TABLE stuinfo
ADD CONSTRAINT CK_stuSeat CHECK     (stuSeat BETWEEN 1 AND 30)
ALTER TABLE stuinfo
ADD CONSTRAINT DF_stuAddress DEFAULT ('地址不祥') FOR stuAddress
INSERT INTO stuinfo(stuName,stuNo,stuSex,stuAge,stuSeat,stuAddress) VALUES ('张秋丽','s25301','男','18','1','北京海淀')
GO
----消息 544,级别 16,状态 1,第 13 行
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'stuinfo' 中的标识列插入显式值。
要求标识列插入显式值,应该怎么做呢……请高手赐教,万分感谢

[ 本帖最后由 jianghong_02 于 2010-10-9 20:01 编辑 ]
10 回复
#2
zhaoyang10082010-10-09 22:15
用IDENTITY(30,-1),这样IDENTITY初始种子值是30,每增加一行减一,然后再添加 constraint CK_stuSeat CHECK     (stuSeat >0),这样就可以保证只有1-30个座位号
#3
gameohyes2010-10-09 22:53
/*-----修改标识列的值-----*/
set identity_insert tableName on
#4
jianghong_022010-10-10 13:59
以上二个方法我都是试了可还是不行也………………
#5
zhaoyang10082010-10-10 15:15
你插入这条数据的座位号必须是1吗?如果不是的话insert的时候把这个字段省略就行了
#6
tangyunzhong2010-10-10 15:46
里面的stuSeat字段是标识,所以在插入的时个不能在语句插入值啊,所以改成下面的就可以,但我这个下面没有包含1-30座位的方法.还有你的stuSex字段是bit类型,只能是0或1.所以应该像下面语句
INSERT INTO stuinfo(stuName,stuNo,stuSex,stuAge,stuAddress) VALUES ('张秋丽','s25301','1','18','北京海淀')

.修改了你出现的问题后还发现你的表设计上还有很多问题.比如
1.你的stuSex索引是唯一索引,这样你只能增加两行,也就是只有stuSex值为0或1两行了.所以你的这个索引似乎没有必要吧,还是你有其他想法.
2.stuSeat既是索引(唯一索引)又是有标识这样这个字段是系统自己生成的,在check的时候一旦你插入的数据行达到或未达到
30行后就会出现问题.标识只能递增或递减.

[ 本帖最后由 tangyunzhong 于 2010-10-10 16:17 编辑 ]
#7
jianghong_022010-10-10 17:47
谢谢……谢谢您谆谆教诲,我把sql图表放在附件里,您
只有本站会员才能查看附件,请 登录
再帮我看看,我应该怎么写,在线等待您的指导……
#8
gameohyes2010-10-10 22:33
程序代码:
USE master
GO
IF EXISTS (SELECT * FROM sysdatabases WHERE name='stuDB')
DROP DATABASE stuDB
CREATE DATABASE  stuDB
ON PRIMARY
( NAME='stuinfo',
  FILENAME='D:\stuinfo.mdf',
  SIZE=3,
  MAXSIZE=10,
  FILEGROWTH=15%

)

GO
USE stuDB
GO
CREATE TABLE stuinfo
(stuName CHAR(32) NOT NULL,--学生姓名
stuNO   CHAR(8)  NOT NULL,--学号
stuSex  bit      NOT NULL,--性别
stuAge  int      NOT NULL,--年龄
stuSeat  SMALLINT IDENTITY (1,1)    NOT NULL,--座位号,采用自动编号方式,且必须是1~30号
stuAddress  TEXT          --学生地址
  
)
      --添加控制
GO
ALTER TABLE stuinfo
ADD CONSTRAINT PK_stuName PRIMARY KEY (stuName)
ALTER TABLE stuinfo
ADD CONSTRAINT UQ_stuNo  UNIQUE      (stuNo)
ALTER TABLE stuinfo
ADD CONSTRAINT UQ_stuSex  UNIQUE      (stuSex)
ALTER TABLE stuinfo
ADD CONSTRAINT CK_stuAge  CHECK      (stuAge BETWEEN 15 AND 40)
ALTER TABLE stuinfo
ADD CONSTRAINT CK_stuSeat CHECK     (stuSeat BETWEEN 1 AND 30)
ALTER TABLE stuinfo
ADD CONSTRAINT DF_stuAddress DEFAULT ('地址不祥') FOR stuAddress

set identity_insert stuinfo on
INSERT INTO stuinfo(stuName,stuNo,stuSex,stuAge,stuSeat,stuAddress) VALUES ('张秋丽','s25301',1,'18','1','北京海淀')
set identity_insert stuinfo off
GO
#9
tangyunzhong2010-10-11 08:16
回复 8楼 gameohyes
你试一下,你上面的语句行得通吗?
还不是和楼主的一个意思
#10
jianghong_022010-10-11 09:09
谢谢……成功了
#11
wlzx4062010-10-14 16:41
路过!
1