SQL练习8 - CHECK / CONSTRAINT / TRIGGER / PROCEDURE / FUNCTION

図1に示すように、定義エンティティ整合性
リレーショナルモデルのエンティティの完全性は、CREATE TABLE PRIMARY KEYと定義されます。一方が他方のテーブル・レベルの制約として定義され、列レベルの制約として定義され、2つの方法が単一のコードのコンフィギュレーション属性を記載があります。コードの構成複数の属性は、唯一の方法が記載されている、すなわち、テーブルレベルの制約として定義されます。
[実施例5.1]属性定義学生スノーコード表。

CREATE TABLE Student
	(Sno CHAR(9) PRIMARY KEY,
	 Sname CHAR(20) NOT NULL,
	 Ssex CHAR(2),
	 Sage SMALLINT,
	 Sdept CHAR(20)
	 );

若しくは

CREATE TABLE Student
	(Sno CHAR(9),
	 Sname CHAR(20) NOT NULL,
	 Ssex CHAR(2),
	 Sage SMALLINT,
	 Sdept CHAR(20),
	 PRIMARY KEY(Sno)
	 );

[実施例5.2]表SCスノに、CNO属性グループは、コードを定義します。

CREATE TABLE SC
	(Sno CHAR(9) NOT NULL,
	 Cno CHAR(4) NOT NULL,
	 Grade SMALLINT,
	 PRIMARY KEY(Sno,Cno)
	 );

エンティティ整合性のチェックと、デフォルトの処理
、彼らが挿入または変更拒否されていない場合は(1)は、ユニークなプライマリキーの値かどうかを確認します。
ブランクが存在する限り、挿入または修飾されたリジェクト(2)主キーのさまざまな属性をチェックし、空です。

参照整合性を定義
、参照整合性は、CREATE TABLE FOREIGN KEY句と外符号として定義されているリレーショナル・モデルをマスタコードを示した参照テーブル参照句の外符号。
[5.3]例参照整合性は、SCで定義されています

CREATE TABLE SC
(Sno CHAR(9) NOT NULL, 
 Cno CHAR(4) NOT NULL,  
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno),   
 FOREIGN KEY(Sno) REFERENCES Student(Sno),  
 FOREIGN KEY(Cno) REFERENCES Course(Cno)
);

例示的な整合性を参照して説明した。[実施例5.4]明示的なデフォルトの処理

CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
 Cno CHAR(4) NOT NULL,
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno)FOREIGN KEY(Sno) REFERENCES Student(Sno) 
 ON DELETE CASCADE
 ON UPDATE CASCADE, 
 FOREIGN KEY (Cno) REFERENCES Course(Cno)	                    
 ON DELETE NO ACTION 	
 ON UPDATE CASCADE   
);

ユーザー定義の整合性

プロパティに対する制約
:を含む、属性定義されたアプリケーションの要件の制約、即ち、属性値の制限に応じて、表に定義属性を作成しながら、
列の値は(NOT NULL)が非空です。
唯一の列の値(UNIQUE)。
満たす条件式(CHECKフレーズ)列の値を確認してください。
定義テーブルSCに[実施例5.5]スノ、CNO、グレード特性がnullであってはならない説明しました。

CREATE TABLE SC
	(Sno CHAR(9) NOT NULL,
	 Cno CHAR(4) NOT NULL,
	 Grade SMALLINT NOT NULL,
	 PRIMARY KEY(Sno,Cno), 
	 ……
	 );

[実施例5.6]部門表DEPTを確立するためには、一意の列ベースのコード部門番号DEPTNOに、部門名DNAME列の値を必要とします

CREATE TABLE DEPT
	(Deptno NUMERIC(2),
	 Dname CHAR(9)UNIQUE NOT NULL,
	 Location CHAR(10),
	 PRIMARY KEY(Deptno)
	 );

Ssex例は、[5.7] Studentテーブルのみを取ることが許され、「男性」または「女性」

CREATE TABLE Student
	(Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(8)NOT NULL,
	Ssex CHAR(2)CHECK(Ssex IN('男','女')),
	Sage SMALLINT,
	Sdept CHAR(20)
	 );

「Sは、検査:
ここに画像を挿入説明
SCグレードの値5.8例表[0] 100との間であるべきであり、そして

CREATE TABLE SC
	(Sno CHAR(9),
	Cno CHAR(4),
	Grade SMALLINT CHECK(Grade>=0 AND Grade<=100),
	PRIMARY KEY(Sno,Cno),
	FOREIGN KEY(Sno) REFERENCES Student(Sno),
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
	 );

プロパティの制約をチェックして、デフォルトの取り扱い
を行っていない場合は、値のタプルを挿入したり、テーブルのプロパティを変更するとき、プロパティが成立しているか否かのリレーショナルデータベース管理システムチェックの制約は、操作が拒否されます。
学生は男性のとき[5.9]の場合、その名前がMSにで始めることはできません。..

CREATE TABLE Student
	(Sno CHAR(9),
	Sname CHAR(8) NOT NULL,
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY(Sno),
	CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')
	 );

デフォルトのタプルと処理上の制約チェック
を行っていない場合はタプルに時間値をや属性を変更し、タプルが成立しているか否かのリレーショナルデータベース管理システムチェックの制約は、操作が拒否されます。

整合性制約句の名前

CONSTRAINT<完整性约束条件名><完整性约束条件>

<整合性制約> NOT NULL、UNIQUE、PRIMARY KEY、含ま FOREIGN KEY、CHECKのようなフレーズ。
例は、学生の登録フォーム学生を確立し、90000から99999の間に学生番号が必要ですが、名前が30歳未満のNULL値、することはできません[5.10]、セックスだけは「男性」または「女性。」

CREATE TABLE Student
	(Sno NUMERIC(6)
		CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
	Sname CHAR(20)
		CONSTRAINT C2 NOT NULL,
	Sage NUMERIC(3)
		CONSTRAINT C3 CHECK(Sage<30),
	Ssex CHAR(2)
		CONSTRAINT C4 CHECK(Ssex IN('男','女')),
		CONSTRAINT StudentKey PRIMARY KEY(Sno)
	 );

例[表5.11]は、教師の先生を確立し、それは各教員賃金は以下3,000ドル以上でなければならないことが必要です。賃金は合計控除サルや控除をリストする必要があります

CREATE TABLE TEACHER
	(Eno NUMERIC(4) PRIMARY KEY,
	Ename CHAR(10),
	Job CHAR(8),
	Sal NUMERIC(7,2),
	Deduct NUMERIC(7,2),
	Deptno NUMERIC(2),
	CONSTRAINT TEACHERKey FOREIGN KEY(Deptno)
	REFERENCES DEPT(Deptno),
	CONSTRAINT C1 CHECK(Sal+Deduct>=3000)
	 );

修飾された表の整合性制約は、
テーブルのALTER TABLEステートメントの整合性制約を変更するために使用することができる
除去[5.12]実施例実施例5.10Student表性別の制限

ALTER TABLE Student DROP CONSTRAINT C4;

[5.13]例学生が変更制約条件テーブルは、学生番号900000から999999の間に必要未満30未満40以上熟成されます。

ALTER TABLE Student
	DROP CONSTRAINT C1;
ALTER TABLE Student
	ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);
ALTER TABLE Student
	DROP CONSTRAINT C3;
ALTER TABLE Student
	ADD CONSTRAINT C3 CHECK(Sage<40);

トリガーは、
ユーザーがイベント駆動型で、テーブル上の手順の特殊なタイプを定義します。
条件- -アクションルールもトリガイベントとして知られています。(例えば、追加、削除するには、テーブル、変更操作、物事の終わりなど)、特定のシステムイベントは、条件が真のアクションがルールを実行するか、このアクションを実行していないかどうかを確認するために、ルールの条件で発生した場合。ルール内のアクション本体は非常に複雑にすることができ、他のテーブルやその他のデータベースオブジェクト、SQLストアドプロシージャの通常の期間を含むことができます。
フォーマットを確立するには、CREATE TRIGGERコマンドを使用してSQLトリガー:

CREATE TRIGGER<触发器名> /*每当触发事件发生的时候,该触发器被激活*/
{BEFORE|AFTER}<触发事件>ON<表名> /*指明触发器激活的时间是执行触发事件前或后*/
REFERENCING NEW|OLD ROW AS<变量> /*REFERENCING指出引用的变量*/
FOR EACH{ROW|STATEMENT} /*定义触发器的类型,指明动作体执行的频率*/
[WHEN<触发条件>]<触发动作体> /*仅当触发条件为真时才执行触发动作体*/

5.21 [例]スコアはOldgrade前に変更された別のテーブルSC_U(スノ、CNO、Oldgrade、Newgrade)に、次いで、10%操作履歴を増加場合グレードSCは、属性テーブルを変更する場合スコアは、Newgrade分率が変更されます。

SC_Uの作成:

CREATE TABLE SC_U
	(Sno CHAR(9) PRIMARY KEY, 
	 Cno CHAR(9),
	 OldGrade SMALLINT,
	 NewGrade SMALLINT
	 );  

トリガーの作成:

CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCING
	OLDROW AS OldTuple,
	NEWROW AS NewTuple
FOR EACH ROW
WHEN(NewTuple.Grade>=1.1*OldTuple.Grade)
	INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)
	VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

T-SQL SQLsever文言の作成と使用をトリガーノートはかなり異なっています。

CREATE TRIGGER SC_T
ON SC
FOR UPDATE
AS
	declare @OLD SMALLINT
	declare @NEW SMALLINT
	declare @SNO CHAR(9)
	declare @CNO CHAR(4)
IF(UPDATE(Grade))
	BEGIN
	select @OLD =Grade FROM DELETED
	select @NEW =Grade FROM INSERTED
	select @SNO =Sno FROM SC
	select @CNO =Cno FROM SC
	IF(@NEW>=1.1*@OLD)
	INSERT INTO SC_U(Sno,Cno,Oldgrade,Newgrade)
	VALUES (@SNO,@CNO,@OLD,@NEW)
END

ここに画像を挿入説明
5.22【実施例】表学生あたりの生徒の数はStudentInsertLogに記録されたテーブルへの挿入操作を増加させました。

CREATE TRIGGER Student_Count
AFTER INSERT ON Student  	         
REFERENCING
 	NEW TABLE AS DELTA
FOR EACH STATEMENT  
    INSERT INTO StudentInsertLog (Numbers)
	SELECT COUNT(*) FROM DELTA

同様に、T-SQLを使用することができません。

CREATE TRIGGER Student_Time
ON Student
AFTER
AS
INSERT 
INTO Student
	INSERT INTO StudentInsertLog(Numbers)
	SELECT COUNT(*) FROM Student;

[5.23]実施例BEFORE完全性を定義し、行レベルのトリガを定義するテーブル教師、教師、教授、未満4000元、自動的に変更4000元場合給与が少ない4000元以上であるルール

CREATE TRIGGER Insert_Or_Update_Sal 
BEFORE INSERT OR UPDATE ON Teacher  
FOR EACH ROW        
BEGIN                             
IF(new.Job='教授') AND (new.Sal<4000) 
THEN  new.Sal :=4000;                
END IF;
END;    

T-SQLの場合:

CREATE TRIGGER Insert_Or_Update_Sal
ON Teacher
FOR UPDATE,INSERT
AS
	IF UPDATE(Sal)
	BEGIN
	declare @TNO CHAR(9)
	declare @TNAME CHAR(9)
	declare @JOB CHAR(9)
	declare @SAL SMALLINT

	select @SAL = Sal FROM INSERTED
	select @TNO =Tno FROM Teacher
	select @TNAME =Tname FROM Teacher
	select @JOB =Job FROM Teacher
	
	IF(@SAL<4000 AND @JOB='教授')
	UPDATE Teacher
	SET SAL=4000
	WHERE Sal<4000 AND Job='教授'
END

削除トリガーSQL構文

DROP TRIGGER <触发器名> ON <表名>;

[実施例8.8]次のアプリケーションを実装するためにストアドプロシージャを使用して:1つの口座振替のお金を口座に2の指定された数から。

CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount  INT,amount FLOAT) 
	AS DECLARE		
	    totalDepositOut Float;
        totalDepositIn Float;
		inAccountnum INT;
BEGIN   
	       SELECT Total INTO totalDepositOut FROM Accout
	            WHERE accountnum=outAccount;
	       IF totalDepositOut IS NULL THEN
	                ROLLBACK; 
	                RETURN
	       END IF;
      IF totalDepositOut< amount THEN   
	       ROLLBACK; 
	       RETURN
      END IF 
  SELECT Accountnum INTO inAccountnum FROM Account
      WHERE accountnum=inAccount;
  IF inAccount IS NULL THEN                       
	ROLLBACK; 
	RETURN;
  END IF;
  UPDATE Account SET total=total-amount WHERE accountnum=outAccount; 
  UPDATE Account SET total=total + amount 
  WHERE accountnum=inAccount; 
  COMMIT; 
END;

ストアドプロシージャの実行

CALL/PERFORM  PROCEDURE 过程名([参数1,参数2,...])

CALLまたはストアドプロシージャの実行、SQLのプロセスを活性化するために使用する他の方法を実行し、データベース・サーバが格納をサポートする手順は、別のプロシージャ本体を呼び出します。
[8.9]例アカウントにアカウントから01003815868 01003813828万元を移しました。

CALL PROCEDURE TRANSFER(01003813828,01003815868,10000`);

T-SQL:

INSERT INTO Account VALUES(01003815868,20000)
INSERT INTO Account VALUES(01003813828,10000)
EXEC	Proc_TRANSFER
		@inAccount = 01003813828,
		@outAccount = 01003815868,
		@amount = 10000	

トリガーは、データベースの機能拡張のためのデータベースで同様のプログラムを完了しました。
プログラムとデータベース接続後の将来については、外部のプログラムやデータベース上のプログラムの主要部分は、実際の試験を知るために、将来のために待機します。
それはより多くのオブジェクト指向の考え方に沿って(すなわち、機能モジュール性、データやプログラムは、多くの場合、再利用混じりさ高くない)されているため、ビューの私の個人的な観点から、より多くの外部プログラムに興味があります。欠点は、内蔵の高速、すべての後に、より大きな過ごす時間プログラムデータベースと対話よりも遅い実行していることがあります。

公開された14元の記事 ウォン称賛10 ビュー3831

おすすめ

転載: blog.csdn.net/jiesfriend/article/details/105317207