データベースデータ制約
1ユーザー操作テーブルのデータを制約するデータ制約とは何ですか2デフォルト値:ユーザーがデフォルト値を使用するフィールドに値を挿入しない場合、デフォルト値を使用します.注:1)デフォルト値フィールドにnullを挿入できます.2)デフォルト値フィールドにnull以外を挿入できる
3非空の役割:制限フィールドに値を付ける必要があります注意:1)非空の文字に値を付ける必要があります2)非空の文字にnullを割り当てることはできません
4一意の役割:フィールドの値に注意を繰り返すことはできません:1)一意のフィールドはnullを挿入できます2)一意のフィールドは複数のnullを挿入できます
5プライマリ・キーの役割:空でない+一意の注意:1)通常、テーブルごとにプライマリ・キー・フィールドが設定されます.テーブル内の各レコードの一意性をマークします.2)テーブルのビジネス意味を含むフィールドをプライマリ・キーとして選択しないことを推奨し、各テーブルにビジネス意味以外のidフィールドを独立して設計することを推奨します.
6自己成長:自動増加
7外部キーの作用:2種類の表のデータを制約して2種類の表の情況が現れます:データの冗長性の高い問題を解決します:独立して1枚の表を出します例えば:従業員の表と部門の表の問題が現れます:従業員の表のデータを挿入する時、従業員の表の部門IDのフィールドは勝手に挿入することができます!外部キー制約の使用:制約従業員テーブルの部門IDフィールド値を挿入する解決方法:従業員テーブルの部門IDフィールドに外部キー制約を追加する
注意:1)拘束されたテーブルをサブテーブル,拘束されたテーブルをメインテーブル,外部キーをサブテーブルにセットする!!!2)プライマリ・テーブルの参照フィールドは、プライマリ・キーとして一般的に使用されます.3)追加データ:メインテーブルを追加してから、サブテーブルを追加する4)修正データ:サブテーブルを修正してから、メインテーブルを修正する5)削除データ:サブテーブルを削除してから、メインテーブルを削除する
8カスケード操作の問題:プライマリ・テーブルを変更または削除するには、外部キー制約がある場合は、サブテーブル内のすべての関連データを変更または削除する必要があります.ただし、プライマリ・テーブル・データを直接変更または削除して、セカンダリ・テーブル・データに影響を与えることを望んでいます.カスケード操作で実装できます!!!カスケード修正:ON UPDATE CASCADEカスケード削除:ON DELETE CASCADE
-- 1.1
CREATE TABLE student( id INT, NAME VARCHAR(20), address VARCHAR(20) DEFAULT ' ' -- ) DROP TABLE student;
-- ,mysql
INSERT INTO student(id,NAME) VALUES(1,' ');
-- : null
INSERT INTO student(id,NAME,address) VALUE(2,' ',NULL);
INSERT INTO student(id,NAME,address) VALUE(3,' ',' ');
3非空の役割:制限フィールドに値を付ける必要があります注意:1)非空の文字に値を付ける必要があります2)非空の文字にnullを割り当てることはできません
-- 1.2
-- : gender ( null)
CREATE TABLE student( id INT, NAME VARCHAR(20), gender VARCHAR(2) NOT NULL -- ) -- INSERT INTO student(id,NAME) VALUES(1,' ');
-- null
INSERT INTO student(id,NAME,gender) VALUES(1,' ',NULL);
4一意の役割:フィールドの値に注意を繰り返すことはできません:1)一意のフィールドはnullを挿入できます2)一意のフィールドは複数のnullを挿入できます
-- 1.3
CREATE TABLE student( id INT UNIQUE, -- NAME VARCHAR(20) ) INSERT INTO student(id,NAME) VALUES(1,'zs');
INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'
INSERT INTO student(id,NAME) VALUES(2,'lisi');
5プライマリ・キーの役割:空でない+一意の注意:1)通常、テーブルごとにプライマリ・キー・フィールドが設定されます.テーブル内の各レコードの一意性をマークします.2)テーブルのビジネス意味を含むフィールドをプライマリ・キーとして選択しないことを推奨し、各テーブルにビジネス意味以外のidフィールドを独立して設計することを推奨します.
-- 1.4 ( + )
DROP TABLE student;
CREATE TABLE student( id INT PRIMARY KEY, -- NAME VARCHAR(20) ) INSERT INTO student(id,NAME) VALUES(1,' ');
INSERT INTO student(id,NAME) VALUES(2,' ');
-- INSERT INTO student(id,NAME) VALUES(1,' '); -- : Duplicate entry '1' for key 'PRIMARY'
-- insert into student(name) value(' '); -- : ERROR 1048 (23000): Column 'id' cannot be null
6自己成長:自動増加
-- 1.5
CREATE TABLE student( id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- , 0 ZEROFILL NAME VARCHAR(20) ) -- , INSERT INTO student(NAME) VALUES(' ');
INSERT INTO student(NAME) VALUES(' ');
INSERT INTO student(NAME) VALUES(' ');
SELECT * FROM student;
--
DELETE FROM student;
--
TRUNCATE TABLE student;
7外部キーの作用:2種類の表のデータを制約して2種類の表の情況が現れます:データの冗長性の高い問題を解決します:独立して1枚の表を出します例えば:従業員の表と部門の表の問題が現れます:従業員の表のデータを挿入する時、従業員の表の部門IDのフィールドは勝手に挿入することができます!外部キー制約の使用:制約従業員テーブルの部門IDフィールド値を挿入する解決方法:従業員テーブルの部門IDフィールドに外部キー制約を追加する
-- ( )
CREATE TABLE dept( id INT PRIMARY KEY, deptName VARCHAR(20) ) -- ( / ) CREATE TABLE employee( id INT PRIMARY KEY, empName VARCHAR(20), deptId INT,-- ID -- CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) -- ( ) )
注意:1)拘束されたテーブルをサブテーブル,拘束されたテーブルをメインテーブル,外部キーをサブテーブルにセットする!!!2)プライマリ・テーブルの参照フィールドは、プライマリ・キーとして一般的に使用されます.3)追加データ:メインテーブルを追加してから、サブテーブルを追加する4)修正データ:サブテーブルを修正してから、メインテーブルを修正する5)削除データ:サブテーブルを削除してから、メインテーブルを削除する
-- 1.6
--
CREATE TABLE employee( id INT PRIMARY KEY, empName VARCHAR(20), deptName VARCHAR(20) -- ) INSERT INTO employee VALUES(1,' ',' ');
INSERT INTO employee VALUES(2,' ',' ');
INSERT INTO employee VALUES(3,' ',' ');
SELECT * FROM employee;
-- ,
INSERT INTO employee VALUES(4,' ',' ');
-- :
--
CREATE TABLE dept( id INT PRIMARY KEY, deptName VARCHAR(20) ) DROP TABLE employee;
--
CREATE TABLE employee( id INT PRIMARY KEY, empName VARCHAR(20), deptId INT,-- ID -- CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE : -- ( ) ) INSERT INTO dept(id,deptName) VALUES(1,' ');
INSERT INTO dept(id,deptName) VALUES(2,' ');
INSERT INTO dept(id,deptName) VALUES(3,' ');
INSERT INTO employee VALUES(1,' ',1);
INSERT INTO employee VALUES(2,' ',1);
INSERT INTO employee VALUES(3,' ',2);
INSERT INTO employee VALUES(4,' ',3);
-- : ,
INSERT INTO employee VALUES(5,' ',4); -- : Cannot add or update a child row: a foreign key constraint fails (`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))
-- 1) , : ,
-- 2) , : ,
-- 3) , : ,
-- ( )
UPDATE dept SET id=4 WHERE id=3;
--
UPDATE employee SET deptId=2 WHERE id=4;
--
DELETE FROM dept WHERE id=2;
--
DELETE FROM employee WHERE deptId=2;
SELECT * FROM dept;
SELECT * FROM employee;
8カスケード操作の問題:プライマリ・テーブルを変更または削除するには、外部キー制約がある場合は、サブテーブル内のすべての関連データを変更または削除する必要があります.ただし、プライマリ・テーブル・データを直接変更または削除して、セカンダリ・テーブル・データに影響を与えることを望んでいます.カスケード操作で実装できます!!!カスケード修正:ON UPDATE CASCADEカスケード削除:ON DELETE CASCADE
CREATE TABLE employee( id INT PRIMARY KEY, empName VARCHAR(20), deptId INT,-- ID -- CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE : -- ( ) ) : -- ( ) -- UPDATE dept SET id=5 WHERE id=4;
--
--
DELETE FROM dept WHERE id=1;