|
| 1 | +--- |
| 2 | +title: "[TIL] SQLite Constraints (제약조건)" |
| 3 | +description: "[TIL]SQLite Constraints" |
| 4 | +thumbnail: "./thumbnail.png" |
| 5 | +date: "2025-09-10T17:00:00" |
| 6 | +category: "TIL" |
| 7 | +tags: ["SQL", "SQLite"] |
| 8 | +--- |
| 9 | + |
| 10 | +SQLite에서 테이블을 대충 만들면 안좋은 사태가 발생합니다; |
| 11 | + |
| 12 | +만약 테이블을 다음과 같이 만든다고 해볼게요. |
| 13 | + |
| 14 | +```sql |
| 15 | +CREATE TABLE movies ( |
| 16 | + title TEXT, |
| 17 | + released INTEGER, |
| 18 | + overview TEXT, |
| 19 | + rating REAL, |
| 20 | + director TEXT |
| 21 | +) strict; |
| 22 | +``` |
| 23 | + |
| 24 | +오.. 뭐 그래도 타입도 들어가있고 썩 나쁘지 않아보입니다. |
| 25 | + |
| 26 | +근데 문제가 있어요. |
| 27 | + |
| 28 | +`rating` 요런데에 음수를 집어넣을 수 있다거나, DB에 중복된 이름으로 데이터가 여러개 있을 수 있다던가.. 그런 부분들이요. |
| 29 | + |
| 30 | +이번 포스팅에서는 그런걸 막기위해 하는 제약조건에 대해 적어볼거에염. |
| 31 | + |
| 32 | +# 제약조건 (Constraints) |
| 33 | + |
| 34 | +일단 제약조건 거는 코드부터 떤질게염. |
| 35 | + |
| 36 | +```sql |
| 37 | +CREATE TABLE movies ( |
| 38 | + title TEXT UNIQUE NOT NULL, |
| 39 | + released INTEGER NOT NULL, |
| 40 | + overview TEXT NOT NULL, |
| 41 | + rating REAL NOT NULL, |
| 42 | + director TEXT |
| 43 | + for_adults INTEGER NOT NULL DEFAULT 0 |
| 44 | +) strict; |
| 45 | +``` |
| 46 | + |
| 47 | +이런식으로 테이블 만들 때 걸어줄 수 있습니다. |
| 48 | + |
| 49 | +보시면 데이터 타입 정의하는 부분 뒤에 막 붙죠? 이게 바로 제약조건이에염. |
| 50 | + |
| 51 | +이름에서 유추 할 수 있듯이 `UNIQUE` 는 중복된 값을 허용하지 않는다는 뜻이고, `NOT NULL` 은 해당 컬럼에 NULL을 허용하지 않는다는 뜻이에염. |
| 52 | + |
| 53 | +`DEFAULT` 는 해당 컬럼에 기본값을 설정한다는 뜻이에염. |
| 54 | + |
| 55 | +이런식으로 제약조건을 걸어줄 수 있어염. |
| 56 | + |
| 57 | +데이터를 넣을때 이제 저 조건에 맞춰서 안넣으면 에러가 나게 될것이에요. |
| 58 | + |
| 59 | +# 제약조건 종류 (Constraints Types) |
| 60 | + |
| 61 | +SQLite에서 제약조건은 다음과 같은 종류가 있구염. |
| 62 | + |
| 63 | +| 제약조건 | 설명 | |
| 64 | +| ----------- | ----------------------------------- | |
| 65 | +| UNIQUE | 중복된 값을 허용하지 않는다. | |
| 66 | +| NOT NULL | 해당 컬럼에 NULL을 허용하지 않는다. | |
| 67 | +| DEFAULT | 해당 컬럼에 기본값을 설정한다. | |
| 68 | +| CHECK | 해당 컬럼에 조건을 추가한다. | |
| 69 | +| PRIMARY KEY | 해당 컬럼을 기본키로 설정한다. | |
| 70 | + |
| 71 | +CHECK 써서 좀 더 복잡한 제약조건을 만들 수 있어염. |
| 72 | + |
| 73 | +이렇게! |
| 74 | + |
| 75 | +```sql |
| 76 | +CREATE TABLE movies ( |
| 77 | + title TEXT UNIQUE NOT NULL, |
| 78 | + released INTEGER NOT NULL, |
| 79 | + overview TEXT NOT NULL, |
| 80 | + rating REAL NOT NULL, |
| 81 | + director TEXT |
| 82 | + for_adults INTEGER NOT NULL DEFAULT 0 CHECK (for_adults = 0 OR for_adults = 1) |
| 83 | +) strict; |
| 84 | +``` |
| 85 | + |
| 86 | +이렇게 하면 `for_adults` 컬럼에는 0 또는 1만 들어갈 수 있어염. |
| 87 | + |
| 88 | +```sql |
| 89 | +(for_adults > -1 OR for_adults < 2) |
| 90 | +``` |
| 91 | + |
| 92 | +이런것도 되고 |
| 93 | + |
| 94 | +```sql |
| 95 | +(for_adults BETWEEN 0 AND 1) |
| 96 | +``` |
| 97 | + |
| 98 | +이런것도 됩니다. |
| 99 | + |
| 100 | +<hr/> |
| 101 | + |
| 102 | +간단하게 제약조건에 대해서 알아봤습니다~ |
| 103 | + |
| 104 | +그럼 이만~ |
0 commit comments