SQL Server由于主外键约束导致插入失败的记录方法
你打算从 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; --建表Department CREATE 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; --建表UserInfo CREATE 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_user CREATE 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_insert INSTEAD OF INSERT ON view_dept_user FOR EACH ROW DECLARE 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 ignored 34/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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

《OracleSQL中除法運算的用法》在OracleSQL中,除法運算是常見的數學運算之一。在資料查詢和處理過程中,除法運算可以幫助我們計算欄位之間的比例或得出特定數值的邏輯關係。本文將介紹OracleSQL中除法運算的用法,並提供具體的程式碼範例。一、OracleSQL中除法運算的兩種方式在OracleSQL中,除法運算可以用兩種不同的方式來進行

Oracle和DB2是兩個常用的關聯式資料庫管理系統,它們都有自己獨特的SQL語法和特性。本文將針對Oracle和DB2的SQL語法進行比較與區別,並提供具體的程式碼範例。資料庫連接在Oracle中,使用以下語句連接資料庫:CONNECTusername/password@database而在DB2中,連接資料庫的語句如下:CONNECTTOdataba

SQL中MINUS的用法及具體程式碼範例在SQL中,MINUS是一種用於在兩個結果集之間執行差集操作的運算子。它用於從第一個結果集中刪除與第二個結果集中相同的行。 MINUS操作符傳回的結果集將包含僅存在於第一個結果集中的行。下面透過具體的程式碼範例來示範MINUS的用法:假設有兩個表-"table1"和"table2",它們的結構如下:表名:table1字段

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

WindowsServerBackup是WindowsServer作業系統自帶的功能,旨在協助使用者保護重要資料和系統配置,並為中小型和企業級企業提供完整的備份和復原解決方案。只有執行Server2022及更高版本的使用者才能使用此功能。在本文中,我們將介紹如何安裝、解除安裝或重設WindowsServerBackup。如何重置Windows伺服器備份如果您的伺服器備份遇到問題,備份所需時間過長,或無法存取已儲存的文件,那麼您可以考慮重新設定WindowsServer備份設定。要重設Windows

解決方法:1、檢查登入使用者是否具有足夠的權限來存取或操作該資料庫,確保該使用者俱有正確的權限;2、檢查SQL Server服務的帳戶是否具有存取指定檔案或資料夾的權限,確保該帳戶具有足夠的權限來讀取和寫入該文件或資料夾;3、檢查指定的資料庫文件是否已被其他進程打開或鎖定,嘗試關閉或釋放該文件,並重新運行查詢;4、嘗試以管理員身份運行Management Studio等等。
