您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

SQL Server由于主外键约束导致插入失败的记录方法

2024/12/26 2:45:34发布19次查看
你打算从 sql server 2000 数据库的客户表和国别表中导入客户数据到 sql server 2005 数据库中。你要确保在导入过程中,客户表中国家代码列的每个值在 sql server 2005 数据库中国别表内都有其相应的纪录。你在两个表之间定义一外键,这样,参照完整性将保证
你打算从 sql server 2000 数据库的客户表和国别表中导入客户数据到 sql server 2005 数据库中。你要确保在导入过程中,客户表中国家代码列的每个值在 sql server 2005 数据库中国别表内都有其相应的纪录。你在两个表之间定义一外键,这样,参照完整性将保证若国家代码值在客户表中存在, 而在国别表中不存在时导入程序失败。 你要确保国别表无记录时导入过程不失败。 --创建department(deptid,deptname)和userinfo(userid, username, sex, logindate,deptid)--其中deptid,userid是自动增长的,并且是主键。deptid是外键。并且插入测试数据--创建序列create sequence seq_dep start with 1 increment by 1 nomaxvalue nocycle cache 30;--建表departmentcreate table department( deptid varchar2(10) primary key, deptname varchar2(20));--插入测试数据insert into department values ('d'||seq_dep.nextval,'人事部');insert into department values ('d'||seq_dep.nextval,'技术部');insert into department values ('d'||seq_dep.nextval,'后勤部');insert into department values ('d'||seq_dep.nextval,'经理部');insert into department values ('d'||seq_dep.nextval,'销售部');insert into department values ('d'||seq_dep.nextval,'服务部');insert into department values ('d'||seq_dep.nextval,'公关部');commit;--创建序列create sequence seq_user start with 1 increment by 1 nomaxvalue nocycle cache 30;--建表userinfocreate table userinfo( userid varchar2(10) primary key, username varchar2(20), sex varchar2(2), logindate date, deptid varchar2(10) references department (deptid));--插入测试数据insert into userinfo values ('u'||seq_user.nextval,'eric schmidt','男','12-9月-07','d1');insert into userinfo values ('u'||seq_user.nextval,'larry page','男','12-10月-07','d3');insert into userinfo values ('u'||seq_user.nextval,'sergey brin','男','12-11月-07','d5');insert into userinfo values ('u'||seq_user.nextval,'w. m. coughran, jr.','男','1-12月-07','d4');insert into userinfo values ('u'||seq_user.nextval,'david c. drummond','女','12-12月-01','d2');insert into userinfo values ('u'||seq_user.nextval,'alan eustace','男','12-9月-07','d1');insert into userinfo values ('u'||seq_user.nextval,'jeff huber','男','12-10月-07','d3');insert into userinfo values ('u'||seq_user.nextval,'george reyes','男','12-11月-07','d5');insert into userinfo values ('u'||seq_user.nextval,'elliot schrage','男','1-12月-07','d4');insert into userinfo values ('u'||seq_user.nextval,'tim armstrong','女','12-12月-01','d2');insert into userinfo values ('u'||seq_user.nextval,'nikesh arora','女','12-12月-01','d2');insert into userinfo values ('u'||seq_user.nextval,'sukhinder','男','12-9月-07','d1');insert into userinfo values ('u'||seq_user.nextval,'vinton g. cerf','男','12-10月-07','d3');insert into userinfo values ('u'||seq_user.nextval,'george reyes','男','12-11月-07','d5');insert into userinfo values ('u'||seq_user.nextval,'dave girouard','男','1-12月-07','d4');insert into userinfo values ('u'||seq_user.nextval,'singh cassidy','女','12-12月-01','d2');commit;--3. 在deptid建立索引create index deptid_index on userinfo(deptid);--4. 给department和userinfo创建同义词,名称分别是dept, sy_usercreate or replace synonym dept for department;create or replace synonym sy_user for userinfo;/*5. 通过同义词dept, user来创建视图,视图要求能查询出“部门名称,部门编号,用户名,性别,注册时间”*/create or replace view view_dept_user(部门名称,部门编号,用户名,性别,注册时间)as select d.deptname,d.deptid,u.username,u.sex,u.logindate from dept d ,sy_user u where d.deptid=u.deptid;--14. 使用instead of触发器,往第5题创建的视图中插入数据。set serveroutput on;insert into view_dept_user ('部门名称','部门编号','用户名','性别','注册时间') values('仓储部','d6','dejan perkovic','男','1-1月-08');/*create or replace view view_dept_user(部门名称,部门编号,用户名,性别,注册时间)as select d.deptname,d.deptid,u.username,u.sex,u.logindate from dept d ,sy_user u where d.deptid=u.deptid;*/create or replace trigger dept_user_insertinstead of insert on view_dept_userfor each rowdeclare cursor cur_dept is select * from department where department.deptid = :new.deptid; cursor cur_user is select * from sy_user where sy_user.username = :new.username; d cur_dept%rowtype; u cur_user%rowtype; did dept.deptid%type; uid sy_user.userid%type;begin open cur_dept; open cur_user; fetch cur_user into u; fetch cur_dept into d; /* 如果插入的数据中部门id不存在,则将 seq_dep.nextval 产生的序号赋值给变量did,执行插入语句新增加一个部门。 */ if cur_dept%notfound then did := 'd'||seq_dep.nextval; insert into department(deptid,deptname) values(did,:new.deptname); /* 如果插入数据中的员工不存在,则执行插入语句增加一个新员工 */ if cur_user%notfound then uid := 'u'||seq_user.nextval; insert into userinfo(userid,username,sex,logindate,deptid) values(uid,:new.username,:new.sex,:new.logindate,did); end if; if cur_dept%found then /* 如果插入的数据中部门id是已经存在的部门id,则更新部门名称 */ did:=:new.deptid; update department set department.deptname where department.deptid = :new.deptid; /* 如果插入数据中的员工不存在,则将seq_user.nextval 产生的序号赋值给变量uid,执行插入语句增加一个新员工 */ if cur_user%notfound then uid := 'u'||seq_user.nextval; insert into userinfo values(uid,:new.username,:new.sex,:new.logindate,:new.deptid); else /* 如果插入数据中的员工已存在,则根据部门id、员工姓名 来更新员工的其他字段的值,员工id为主键,不用更新。 考虑到同名员工存在的可能,但员工的id不可能相同的特点,需要根据插入数据中的部门id、员工姓名来查询出 符合要求的员工的id,用员工id来进行后续的操作 */ select userid into uid from userinfo where userinfo.username=:new.username and userinfo.deptid=did; update userinfo set userinfo.sex = :new.sex,userinfo.logindate = :new.logindate,userinfo.deptid = :new.sex where userinfo.userid=uid and userinfo.username=:new.username; end if; end if; close ecur; close dcur;end dept_user_insert;/show errors;出现的错误提示:警告: 创建的触发器带有编译错误。sql> show errors;trigger dept_user_insert 出现错误:line/col error-------- -----------------------------------------------------------------3/31 pls-00049: 错误的赋值变量 'new.deptid'5/30 pls-00049: 错误的赋值变量 'new.username'20/56 pls-00049: 错误的赋值变量 'new.deptname'26/75 pls-00049: 错误的赋值变量 'new.username'26/89 pls-00049: 错误的赋值变量 'new.sex'26/98 pls-00049: 错误的赋值变量 'new.logindate'33/10 pls-00049: 错误的赋值变量 'new.deptid'34/4 pl/sql: sql statement ignored34/46 pl/sql: ora-00927: 缺少等号34/72 pls-00049: 错误的赋值变量 'new.deptid'40/37 pls-00049: 错误的赋值变量 'new.username'line/col error-------- -----------------------------------------------------------------40/51 pls-00049: 错误的赋值变量 'new.sex'40/60 pls-00049: 错误的赋值变量 'new.logindate'40/75 pls-00049: 错误的赋值变量 'new.deptid'47/66 pls-00049: 错误的赋值变量 'new.username'49/40 pls-00049: 错误的赋值变量 'new.sex'49/70 pls-00049: 错误的赋值变量 'new.logindate'49/103 pls-00049: 错误的赋值变量 'new.sex'50/53 pls-00049: 错误的赋值变量 'new.username'55/5 pls-00103: 出现符号 dept_user_insert在需要下列之一时: if
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product