SQLite 입문 튜 토리 얼 3 많은 제약 조건 Constraints
9789 단어 구속 하 다Constraints
지난 수필 의 마지막 부분 에서 나 는 제약 을 언급 했 지만 그곳 에서 나 는 그것 을 한정 부적 으로 번역 했다.정확 하지 않다.여기 서 먼저 수정 하고 제약 으로 번역 해 야 한다.그렇다면 구속 이란 무엇 일 까?
우리 가 데이터베이스 에 데 이 터 를 저장 할 때,일부 데 이 터 는 뚜렷 한 제약 조건 이 있다.예 를 들 어 한 학교 에서 교사 에 관 한 데이터 시트 는 그 중의 필드 열 에 다음 과 같은 제약 이 있 을 수 있다.
나이-적어도 20 세 이상.20 세 미 만 의 교 사 를 입력 하려 면 시스템 이 국적 을 잘못 신고 할 수 있 습 니 다.-기본 중국.기본 값 이란 입력 하지 않 으 면 시스템 이 자동 으로 기본 값 이름 을 입력 하 는 것 입 니 다.-비어 있 으 면 안 됩 니 다.사람마다 이름 이 있 잖 아 요.직원 번호.-유일 하 게.이것 은 함부로 해 서 는 안 된다.월급 을 잘못 보 내 면 번 거 로 워 진다.위 에서 언급 한 것 보다 크 고 기본 적 이 며 비어 서 는 안 되 며 유일한 것 이 바로 데이터 의 제약 조건 이다.우 리 는 CREATE TABLE 로 표를 만 들 때 각 필드 열의 제약 조건 을 미리 설명 해 야 한다(있 으 면).나중에 표 에 데 이 터 를 입력 할 때 시스템 은 자동 으로 제약 조건 을 만족 시 키 는 지 확인 해 주 고 시스템 이 만족 하지 않 으 면 잘못 보고 할 수 있다.
SQLite 상용 제약 조건 은 다음 과 같 습 니 다.
NOT NULL-비 어 있 는 UNIQUE-유일한 PRIMARY KEY-주 키 FOREIGN KEY-외 키 체크-조건 검사 DEFAULT-기본 값
2.메 인 키 PRIMARY KEY
우 리 는 SQLite 명령 행 환경 에 들 어가 test.db 데이터 베 이 스 를 만들어 실험 을 하 는 것 이 좋 습 니 다.다음 과 같 습 니 다.
myqiao@ubuntu:~/My Documents/db$ sqlite3 test.db
-- Loading resources from /home/myqiao/.sqliterc
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
sqlite>
실행.tables 명령 이 되 돌아 오지 않 았 습 니 다.데이터베이스 가 비어 있 음 을 설명 합 니 다.만약 당신 의 데이터베이스 에 내용 이 있 고 아래 의 실험 에 영향 을 미친다 면,당신 은 우리 가 전편 에서 배 운 DROP TABLE 로 영향 을 미 치 는 시 계 를 삭제 하거나,ALTER TABLE...RENAME TO...로 이름 을 바 꿀 수 있 습 니 다.--------------------------------------------------------------------------------
다음은 바로 돌아 가 겠 습 니 다.메 인 키 PRIMARY KEY 를 말씀 드 리 겠 습 니 다.
먼저,데이터 시트 의 모든 기록 에는 메 인 키 가 있 는데 이것 은 우리 의 모든 신분증 번호,직원 번호,은행 계좌 와 같다.반대로 모든 메 인 키 가 데이터 기록 에 대응 하고 있다 고 할 수 있다.따라서 메 인 키 는 유일 해 야 한다.그 다음으로 일반적인 상황 에서 메 인 키 는 색인 이기 때문에 메 인 키 를 통 해 기록 속 도 를 찾 는 것 이 비교적 빠르다.셋째,관계 형 데이터 베이스 에서 하나의 표 의 메 인 키 는 다른 표 의 외 키 로 할 수 있다.그러면 이 두 표 사 이 는 이 키 를 통 해 관 계 를 맺 을 수 있다.마지막 으로 메 인 키 는 보통 정수 나 문자열 이 며 유일한 것 만 보장 하면 됩 니 다.SQLite 에서 홈 키 가 정수 형식 이 라면 이 열의 값 은 자동 으로 증가 할 수 있 습 니 다.
--------------------------------------------------------------------------------
다음은 저희 가 실험 을 해 보도 록 하 겠 습 니 다.
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> SELECT * FROM Teachers;
Id Name
---------- ----------
1
2
3
sqlite> INSERT INTO Teachers(Id,Name) Values(2,' ');
Error: PRIMARY KEY must be unique
sqlite>
--------------------------------------------------------------------------------우 리 는 먼저 Teachers 표를 새로 만 들 고 두 개의 필드 열 을 설 정 했 습 니 다.그 중에서 Id 필드 열 은 주 키 열 입 니 다.그 다음 에 우 리 는 그 안에 세 개의 데 이 터 를 삽입 하고 조회 하여 모든 것 이 정상 이 라 고 피드백 했다.
메모:앞의 세 개의 데 이 터 를 삽입 할 때 명령 에 Id 의 값,시스템 자동 할당,그리고 수치 가 자동 으로 증가 하 는 것 을 명확 하 게 가리 키 지 않 았 습 니 다.
네 번 째 데 이 터 를 삽입 할 때 저 는 명확 한 Id 번 호 를 2 로 주 었 습 니 다.이사 의 번 호 는 이미 2 이기 때문에 시스템 은 저 에 게 오 류 를 알려 주 었 습 니 다.메 인 키 는 유일 해 야 합 니 다.
3.기본 값 DEFAULT
어떤 특별한 필드 열 은 모든 기록 에서 그의 값 은 기본적으로 같다.다만 개별 상황 에서 만 다른 값 으로 바 꿀 수 있 습 니 다.이러한 필드 열 은 우리 가 그 에 게 기본 값 을 설정 할 수 있 습 니 다.
다음은 저희 가 실험 을 해 보도 록 하 겠 습 니 다.
sqlite>
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Country text DEFAULT ' ');
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> INSERT INTO Teachers(Name) Values(' ');
sqlite> INSERT INTO Teachers(Name,Country) Values(' ',' ');
sqlite> SELECT * FROM Teachers;
Id Name Country
---- --------------- ---------------
1
2
3
4
sqlite>
이전 Teachers 표를 삭제 하고 다시 만 듭 니 다.이번에 Teachers 표 에 Country 필드 가 하나 더 생 겼 고 기본 값 을'중국'으로 설정 한 다음 에 우 리 는 네 개의 데 이 터 를 Teachers 표 에 삽입 했다.앞의 세 가지 데 이 터 는 모두 Country 필드 의 값 을 명확 하 게 가리 키 지 않 았 고 네 번 째 데이터 만'손오공'의 Country 를'천정'이 라 고 가 리 켰 다.
데 이 터 를 조회 한 결과 앞의 세 가지 데이터 가 모두 기본 값 을 채 워 서 실험 에 성공 했다.
--------------------------------------------------------------------------------------------------------------------4.비 어 있 는 NOT NULL 의 일부 필드 는 우리 가 무엇 을 채 워 야 할 지 모 르 는 동시에 기본 값 도 설정 하지 않 았 을 수도 있 습 니 다.데 이 터 를 추가 할 때 우 리 는 이러한 필드 를 비 워 서 채 우지 않 습 니 다.시스템 은 그 가 NULL 값 이 라 고 생각 합 니 다.
그러나 또 다른 필드 가 있어 데 이 터 를 채 워 야 하 며,채 우지 않 으 면 시스템 이 잘못 보고 할 수 있다.이러한 필드 는 NOT NULL 비 공 필드 라 고 불 리 며 정의 표 에서 미리 설명 해 야 합 니 다.
다음은 저희 가 실험 을 해 보도 록 하 겠 습 니 다.
sqlite>
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Age integer NOT NULL,City text);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name,Age) Values('Alice',23);
sqlite> INSERT INTO Teachers(Name,Age) Values('Bob',29);
sqlite> INSERT INTO Teachers(id,Name,Age) Values(6,'Jhon',36);
sqlite> SELECT * FROM Teachers;
Id Name Age City
---- --------------- --------------- ---------------
1 Alice 23 NULL
2 Bob 29 NULL
6 Jhon 36 NULL
sqlite> INSERT INTO Teachers(Name) Values('Mary');
Error: Teachers.Age may not be NULL
sqlite>
낡은 시 계 를 삭제 하고 새 시 계 를 만 드 는 것 이 좋 습 니 다.이번 Teachers 표 는 NOT NULL 필드 Age 를 설명 하 는 동시에 NULL 을 위 한 필드 City 도 있 습 니 다.
앞의 세 개의 데 이 터 를 삽입 해도 City 의 값 이 지정 되 지 않 았 습 니 다.검색 하면 City 필드 가 모두 비어 있 는 것 을 볼 수 있 습 니 다.
메모:여기 있 는 NULL 은'아무것도 없다'는 디 스 플레이 형식 일 뿐'nullvalue 명령'을 통 해 다른 형식 으로 바 꿀 수 있 습 니 다.첫 번 째 편 을 구체 적 으로 볼 수 있 습 니 다.
네 번 째 데 이 터 를 삽입 할 때 Age 의 값 을 지정 하지 않 으 면 시스템 이 잘못 보 고 됩 니 다.Teachers.Age 가 비어 있 으 면 안 됩 니 다.
5.유일한 UNIQUE 라 는 제약 은 이해 하기 쉽 습 니 다.주 열 을 제외 하고 일부 열 도 중복 값 이 있어 서 는 안 됩 니 다.긴 말 하지 않 고 코드 를 직접 보다.
sqlite>
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text UNIQUE);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) VALUES('Alice');
sqlite> INSERT INTO Teachers(Name) VALUES('Bob');
sqlite> INSERT INTO Teachers(Name) VALUES('Jane');
sqlite> INSERT INTO Teachers(Name) VALUES('Bob');
Error: column Name is not unique
sqlite>
이번 Teachers 표 는 Name 이라는 열 만 있 지만 Name 열 에 중복 값 이 있 으 면 안 됩 니 다.우리 가 두 번 째 로 Bob 을 삽입 할 때 시스템 이 잘못 보고 한 것 을 볼 수 있다.6.조건 검사 CHECK
어떤 값 은 일정한 조건 에 부합 되 어야 저장 을 허용 합 니 다.이것 은 이 CHECK 제약 을 사용 해 야 합 니 다.
sqlite>
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Age integer CHECK(Age>22));
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Age) VALUES(45);
sqlite> INSERT INTO Teachers(Age) VALUES(33);
sqlite> INSERT INTO Teachers(Age) VALUES(23);
sqlite> INSERT INTO Teachers(Age) VALUES(21);
Error: constraint failed
sqlite>
Age 필드 는 22 이상 이 어야 합 니 다.삽 입 된 데이터 가 22 보다 적 을 때 시스템 오류 가 발생 합 니 다.7.외부 키 FOREIGN KEY
현재 우리 의 데이터베이스 에는 Teachers 표 가 있 습 니 다.만약 에 우리 가 Students 표를 하나 더 만 들 면 Students 표 의 모든 학생 들 이 하나의 Teachers 표 중의 교사 에 대응 하도록 요구 합 니 다.
간단 하 다.Students 표 에 TeacherId 필드 를 만들어 해당 교사 의 Id 번 호 를 저장 하면 학생 과 교사 간 에 관 계 를 맺 을 수 있다.
--------------------------------------------------------------------------------
문 제 는 우리 가 학생 들 에 게 Teachers 표 에 없 는 TeacherId 값 을 저장 할 수 있 고 이 오 류 를 발견 하지 못 할 수도 있다 는 것 이다.
이 경우 Students 표 의 TeacherId 필드 를 외부 키 로 표시 하여 Teachers 표 의 Id 필드 에 값 을 대응 할 수 있 습 니 다.
이렇게 하면 Students 표 에 존재 하지 않 는 교사 Id 를 저장 하면 시스템 이 잘못 보고 된다.
sqlite>
sqlite> .tables
Teachers
sqlite> CREATE TABLE Students (Id integer PRIMARY KEY, TeacherId integer, FOREIGN KEY(TeacherId) REFERENCES Teachers(id) );
sqlite> .tables
Students Teachers
sqlite> SELECT * FROM Teachers;
Id Age
---- ---------------
1 40
2 33
3 23
sqlite> INSERT INTO Students(TeacherId) VALUES(1);
sqlite> INSERT INTO Students(TeacherId) VALUES(3);
sqlite> INSERT INTO Students(TeacherId) VALUES(9);
sqlite> SELECT * FROM Students;
Id TeacherId
---- ---------------
1 1
2 3
3 9
sqlite>
여기에 Students 표를 만 들 고 TeacherId 를 외부 키 로 Teachers 표 의 Id 열 과 대응 합 니 다.문제 가 왔 습 니 다.삽 입 된 앞의 두 데 이 터 는 문제 가 없습니다.Id 번호 1,3 은 모두 Teachers 표 에 있 기 때 문 입 니 다.그러나 숫자 9 는 Teachers 표 에 있 지 않 고 잘못 보고 하지 않 았 을 뿐만 아니 라 시스템 에 저장 되 어 있 는 이 유 는 무엇 일 까?
SQLite 의 외부 키 제약 은 기본적으로 열 리 지 않 는 다 고 합 니 다.이 기능 이 필요 하 다 면 소스 코드 버 전 을 다운로드 하고 모든 컴 파일 파 라 메 터 를 설정 한 다음 에 다시 컴 파일 해 야 합 니 다.그러면 외부 키 를 지원 하 는 SQLite 를 얻 을 수 있 습 니 다.