>  기사  >  데이터 베이스  >  MySQL 데이터베이스 제약조건 분석 및 테이블 디자인 예시

MySQL 데이터베이스 제약조건 분석 및 테이블 디자인 예시

WBOY
WBOY앞으로
2023-05-29 22:40:051058검색

데이터베이스 제약 조건

null이 아님

특정 열의 저장 공간이 null 값이 될 수 없도록 지정

create table student (id int not null,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

unique

특정 열이 고유한 값을 가져야 함을 보장하세요. 중복된 값을 삽입하면 오류가 발생합니다. Reported

default

열에 값을 할당할 때 기본값

create table student(id int,name varchar(20) default '匿名');

기본 키 기본 키

기본 키 제약 조건은 Not Null과 고유의 조합으로, 열에 값을 할당할 수 없도록 지정됩니다. null이며 고유합니다

auto_increment 자동 증가 기능:

1. 테이블 레코드에 값이 없으면 1

2부터 자동 증가가 시작됩니다. 데이터가 있으면 이전부터 자동 증가합니다. 기록 다운

3. 데이터를 삽입한 후 삭제하면 자동 증가된 값은 재사용되지 않고 삭제된 값부터 시작됩니다. 자동 증가

create table student (id int primary key auto_increment,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into student values(null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
+----+--------+
1 row in set (0.00 sec)

외래 키 외래 키

외래 키 제약 조건, 테이블 1의 데이터 테이블 2에 있어야 합니다. 무결성 기준을 참조하세요.

외래 키 제약 조건은 두 테이블의 두 열 사이의 관계를 설명합니다. "종속성"

외래 키 제약 조건은 테이블 삭제에 영향을 미칩니다. 다음 인스턴스는 연결되어 있어서 쉽게 삭제가 되지 않습니다

mysql> create table class (
    -> id int primary key,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.04 sec)
mysql> create table student (
    -> id int primary key,
    -> name varchar(20) not null,
    -> email varchar(20) default 'unknow',
    -> QQ varchar(20) unique,
    -> classId int , foreign key (classId) references class(id)
    -> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc class;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| email   | varchar(20) | YES  |     | unknow  |       |
| QQ      | varchar(20) | YES  | UNI | NULL    |       |
| classId | int(11)     | YES  | MUL | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

check

조건을 지정하고 조건에 따라 값을 결정하세요

하지만 mysql은

create table test_user (
   id int,
   name varchar(20),
   sex varchar(1),
   check (sex ='男' or sex='女')
);

테이블 디자인

One-to-one

One을 지원하지 않습니다. 1대1 설계 테이블은 학생 테이블과 계정 테이블과 같습니다. 하나의 계정은 하나의 학생에 해당하며, 하나의 학생은 하나의 계정만 가집니다

표현 방법

1. 이 두 엔터티는 하나의 테이블로 표현될 수 있습니다

2. 두 개의 테이블로 표현될 수 있으며, 그 중 하나에는 다른 테이블의 ID가 포함됩니다.

일대다

학생은 a에 있어야 합니다. 수업에서 수업에는 여러 학생이 포함될 수 있습니다.

표현 방법:

1 . 클래스 테이블에서 이 클래스의 학생 ID를 나타내는 새 열을 추가합니다(mysql에는 배열 유형이 없으며 redis는 가능함)

2. 클래스 테이블에서 classId의 새 열은 변경되지 않습니다.

다대다

다대다 설계 테이블은 학생 테이블 및 강좌 일정과 같습니다. 한 학생이 여러 코스를 선택할 수도 있고, 하나의 코스를 여러 학생이 선택할 수도 있습니다.

표현 방법:

연관 테이블을 사용하여 두 엔터티 간의 관계를 나타냅니다.

다대다 테이블 생성 인스턴스

-- 学生表
mysql> create table test_student (
    -> id int primary key,
    -> name varchar(10) default 'unknow'
    -> );
Query OK, 0 rows affected (0.03 sec)
-- 选课表
mysql> create table test_course (
    -> id int primary key,
    -> name varchar(20) default 'unknow'
    -> );
Query OK, 0 rows affected (0.02 sec)
-- 成绩表
mysql> create table test_score (
    -> studentId int,
    -> courseId int,
    -> score int,
    -> foreign key (studentId) references test_student(id),
    -> foreign key (courseId) references test_course(id)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc test_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | unknow  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc test_coures;
ERROR 1146 (42S02): Table 'java_5_27.test_coures' doesn't exist
mysql> desc test_course;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | unknow  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc test_score;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| studentId | int(11) | YES  | MUL | NULL    |       |
| courseId  | int(11) | YES  | MUL | NULL    |       |
| score     | int(11) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

다대다를 달성하려면 인스턴스에 데이터를 삽입하세요

mysql> insert into test_student values (1, 'listen');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_course values (1, '数学');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_student values (2, 'Faker');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_course values (2, '数学');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values(1, 1, 90);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (1, 2, 99);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (2, 1, 50);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (2, 2, 60);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_student;
+----+--------+
| id | name   |
+----+--------+
|  1 | listen |
|  2 | Faker  |
+----+--------+
2 rows in set (0.00 sec)

mysql> select * from test_course;
+----+--------+
| id | name   |
+----+--------+
|  1 | 数学   |
|  2 | 语文   |
+----+--------+
2 rows in set (0.00 sec)

mysql> select * from test_score;
+-----------+----------+-------+
| studentId | courseId | score |
+-----------+----------+-------+
|         1 |        1 |    90 |
|         1 |        2 |    99 |
|         2 |        1 |    50 |
|         2 |        2 |    60 |
+-----------+----------+-------+
4 rows in set (0.00 sec)

위 내용은 MySQL 데이터베이스 제약조건 분석 및 테이블 디자인 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제