SQLite 데이터베이스 제약 조건 상세 정보

1. Constraints 구속
SQLite 데이터베이스에 데이터를 저장할 때 일부 데이터는 뚜렷한 제약 조건이 있다.예를 들어 한 학교에서 교사에 대한 데이터 표를 보면 그 중의 필드 열은 다음과 같은 제약이 있을 수 있다.
나이-적어도 20세 이상.만약 네가 20세 이하의 교사를 기록하고 싶다면 시스템이 틀릴 것이다.
국적-묵인 중국.기본값이란 당신이 기입하지 않으면 시스템이 자동으로 기본값을 기입하는 것이다.
이름 - 공백일 수 없습니다.사람마다 이름이 있잖아.
직원 번호 - 유일.이것은 함부로 해서는 안 된다. 월급을 잘못 주면 골치 아프게 된다.
위에서 언급한 것보다 크고 기본적이며 비울 수 없고 유일한 것이 바로 데이터의 제약 조건이다.CREATE TABLE로 테이블을 만들 때 각 필드 열의 제약조건을 미리 설명(있을 경우)하고 나중에 테이블에 데이터를 입력할 때 시스템이 자동으로 제약조건을 충족하는지 확인합니다. 그렇지 않으면 오류가 발생합니다.
SQLite 데이터베이스의 일반적인 구속조건은 다음과 같습니다.
NOT NULL - 비어 있지 않음UNIQUE - 고유PRIMARY KEY - 기본 키FOREIGN KEY - 외부 키CHECK - 조건 검사DEFAULT - 기본값2. 메인 키 PRIMARY KEY
SQLite 명령줄 환경에 들어가서 테스트를 만듭니다.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로 주었다. 이 4의 번호는 이미 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표에는 Country 필드가 하나 더 있고 기본값을 '중국' 으로 설정한 다음 네 개의 데이터를Teachers표에 삽입합니다.
앞의 세 가지 데이터는 모두 Country 필드의 값을 명확하게 가리키지 않았고 네 번째 데이터만'손오공'의 Country를'천정'이라고 가리킨다.
데이터를 조회하여 앞의 세 가지 데이터가 모두 기본값을 기입한 것을 발견하여 실험에 성공하였다.
데이터가 약간 변형되었습니다, 명령.width 4 15 15에 설정된 열 너비로 통과할 수 있습니다.show 보기, 중국어 때문에 그런지 정렬이 안 됐어요.
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 필드가 모두 비어 있음을 알 수 있습니다.
주의: 여기 있는 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 표에 Teacher Id 필드를 만들어서 교사의 Id 번호를 저장하면 학생과 교사의 관계가 성립됩니다.
문제는 우리가 학생들에게 길잡이 표에 없는 길잡이 Id 값을 저장할 수도 있고, 이 오류를 발견하지 못할 수도 있다는 것이다.
이 경우 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 테이블을 만들고 Teacher Id를 외부 키로 Teachers 테이블의 Id 열에 대응합니다.

좋은 웹페이지 즐겨찾기