PRIMARY KEY 違反、制約 'PK_T2': オブジェクト 'T2' には重複したキーは挿入できません。/r/nステートメントは終了されました。
分析:上述问题是说往表T2中进行插入时候,主键重复插入。因为一个表可能有1个或多个主键,但是不论有几个,数据库中的表对主键而言都要唯一。
①
首先建立一个学生表,SNO为主键
CREATE TABLE Student_Info
(
SNO INT CONSTRAINT S1 PRIMARY KEY,
SNAME CHAR(6) CONSTRAINT S2 NOT NULL,
SEX CHAR(2) CONSTRAINT S3 CHECK(SEX IN ('0','1')),
BIRTHDAY DATETIME
)
②向该表中插入3条数据
INSERT INTO Student_Info
SELECT 1,'TOM','1','1983/04/15'
UNION ALL
SELECT 2,'HERRY','0','1983/04/16'
UNION ALL
SELECT 3,'JIM','1','2008/10/17'
③如果我们使用经常用到的SQL 来再一次把 姓名是TOM的这条信息插入一次。
Insert Into Student_Info (SNO,SNAME,SEX,BIRTHDAY)
Values( 1,'TOM','1','1983/04/15')
就会出现我们上述所说的错误。即主键重复不能重复插入。
④下面我们不用第三步的SQL 而是利用程序代码形式以DataSet方式在DataSet表中添加一行,同样把新添的该行赋值为上述TOM信息,然后利用Update 方法更新回数据库。看看会如何呢?
string strConn="Data Source=.;Initial Catalog=Test;User ID=sa;Password=";
SqlConnection conn=new SqlConnection (strConn);
SqlCommand cmd=new SqlCommand ("select * from Student_Info", conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
//自动生成用于数据集更新的命令
SqlCommandBuilder cb=new SqlCommandBuilder(sda);
//填充数据集
DataSet public_ds =new DataSet();
sda.Fill (public_ds,"Student_Info");
//修改数据集—此处把TOM信息再次插入
DataRow drRow = public_ds.Tables[0].NewRow();
drRow["SNO"]=1;
drRow["SNAME"]="TOM";
drRow["SEX"]="1";
drRow["BIRTHDAY"]="1983/04/15";
public_ds.Tables[0].Rows .Add(drRow);
//用更改后的数据集更新数据库
sda.Update(public_ds,"Student_Info");