데이터베이스 소개_02

데이터 유형

  • 데이터 유형을 정의한다는 것은 컬럼을 정의하는 것이며, 데이터 유형에 따라 데이터의 특성이 결정됩니다.
  • 데이터 유형은 주로 문자열 유형, 부동 소수점 책 유형 및 고정 소수점 숫자 유형, 날짜 유형 및 이진 유형으로 나뉩니다.
  • 데이터 유형은 다른 스토리지 엔진에서 다르게 동작합니다.
  • 사용된 데이터 유형, 요구 사항 및 데이터 특성에 따라 데이터 유형을 선택합니다.

데이터 저장은 데이터 처리의 첫 번째 단계입니다. 데이터가 올바르게 저장된 경우에만 효과적으로 처리하고 분석할 수 있습니다. 그렇지 않으면 시작할 방법이 없는 엉망진창이 될 수 있습니다. 그렇다면 사용자의 다양한 비즈니스 관련 복잡하고 복잡한 데이터를 어떻게 질서 있고 효율적으로 저장할 수 있을까요? MySQL에서 전체 데이터 저장 프로세스는 데이터베이스 생성, 필드 확인, 데이터 테이블 생성, 데이터 삽입의 총 4단계로 이루어집니다.

데이터 테이블을 직접 생성하는 대신 먼저 데이터베이스를 생성하고 싶습니까?

  • 시스템 아키텍처 수준의 관점에서 볼 때 MySQL 데이터베이스 시스템은 큰 것부터 작은 것까지 [데이터베이스 서버, 데이터베이스, 데이터 테이블
    , 데이터 테이블의 행 및 열]입니다.

데이터 유형은 주로 도메인 무결성 제약 조건을 열에 추가합니다. 개발자가 열의 데이터 유형을 설정하면 DBMS에서 추가된 데이터의 유효성을 확인하고 잘못된 경우 오류를 보고하고 추가를 거부합니다.

숫자

  • 정수의 5가지 유형 tinyint, smallint, mediumint, int, bigint, 주요 차이점은 값 범위가 다르고
    유형 앞에 제한 단어 unsigned를 추가할 수 있으며 음수는 허용되지 않는다는 것 입니다.
  • 3개의 부동 소수점 유형: float 및 double은 정확하게 저장할 수 없지만 10진수 및 숫자는 정확하게 저장할 수 있습니다.
유형 이름 설명하다
아주 작은 1B, 값 범위 -128 ~ 127
smallint 2B, 값 범위는 -32768 ~ 32767입니다.
중간 3B, 값 범위는 -8388608 ~ 8388607입니다.
정수 또는 정수 4B, 값 범위는 2e9
비긴트 8B, 값 범위는 9e18
뜨다 4B, 단정밀도 부동 소수점 유형에서 값 범위는 3.4e38이며, 여기서 n은 전체 비트 폭이고 m은 소수 자릿수입니다. n>=m이어야 하며, nm이 정의되지 않은 경우 기본적으로 7-8비트의 유효한 데이터가 제공됩니다.
더블 8B, 배정도 부동 소수점 유형, 값 범위는 1.7e308이며 총 자릿수는 15를 초과하지 않습니다.
십진법과 숫자 고정 소수점 저장소는 부동 소수점 숫자를 저장하는 데 사용되며 특정 바이트 수는 정의 중에 설정된 매개 변수에 따라 다릅니다. 비트 폭이 설정되지 않은 경우 기본값은 (10,0), 최대 총 비트 폭은 65, 최대 소수 자릿수는 30입니다.

unsigned는 열을 부호 없는 것으로 설정하고 0보다 크거나 같은 데이터만 저장할 수 있으며 음수는 없습니다. 무부호형을 사용하면 값 범위에
음수가 없어 상한값의 2배가 됩니다.

create table t3(id int unsigned); 
mysql> insert into t3 value(-10); -- 不允许存储负数 
ERROR 1264 (22003): Out of range value for column 'id' at row 1 
mysql> insert into t3 value(255); -- 存储数据的上线扩大一倍
Query OK, 1 row affected (0.01 sec)

int(5)와 같이 양의 정수를 포함하는 타입 이름 뒤에 괄호를 추가할 수 있는데, 여기서 의미는 5자리 길이의 정수만 저장할 수 있다는 의미가 아니라 쿼리 시 자동으로 저장된다는 의미입니다. 5 길이까지 공백으로 채워집니다. 실제 데이터 길이가 5보다 크면 실제 데이터 길이에 따라 출력됩니다.

mysql> create table t4(id int(2)); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into t4 values(99999); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t4 values(9); 
Query OK, 1 row affected (0.01 sec)

mysql> select * from t4;
+-------+
| id | 
+-------+ 
| 99999 | 
| 	  9 | 
+-------+
2 rows in set (0.00 sec)

10진수 및 숫자는 부동 소수점 숫자를 문자열로 저장하므로 float 및 double 에
이진 부동 소수점 숫자 저장을 사용하는 대신 부동 소수점 숫자 의 정확한 저장을 실현할 수 있습니다. 숫자(전체 비트 폭, 소수점 이하 자릿수) 방법을 사용하여 소수점 이하 자릿수는 전체 비트 폭보다 작거나 같아야 합니다. 65입니다. 저장할 수 있는 데이터가 범위를 초과할 수 있으며 그 안에 있는 기호 숫자 및 소수점은 비트의 너비를 차지하지 않으며,

mysql> create table t5(id numeric(5,3)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into t5 values(99.999); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t5 values(-99.999); -- 位宽统计中符号位不算 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t5 values(100); -- 整数超出范围报错 ERROR 1264 (22003): 
Out of range value for column 'id' at row 1 

mysql> insert into t5 values(9.1235); -- 小数位数多余则自动四舍五入 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> insert into t5 values(9.1234); 
Query OK, 1 row affected, 1 warning (0.01 sec) 

mysql> select * from t5; 
+---------+ 
| id      | 
+---------+ 
|  99.999 | 
| -99.999 | 
|   9.124 | 
| 	9.123 | 
+---------+ 
4 rows in set (0.00 sec)

정수 및 숫자

  • int 유형은 소수점 이하 자릿수를 저장할 수 없으며 소수점 이하 자릿수를 저장할 때 자동으로 반올림됩니다.
mysql> create table t6(id int); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into t6 values(99.99); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from t6; 
+------+ 
|  id  | 
+------+ 
|  100 | 
+------+ 
1 row in set (0.00 sec)
  • 숫자는 소수 자릿수를 저장할 수 있으며 소수 자릿수가 0이면 int 유형의 저장 효과를 시뮬레이션할 수 있습니다. 사용되는 실제 저장 방법은
    문자열입니다. 쿼리 효율성은 int보다 훨씬 낮습니다.
mysql> create table t7(id numeric); 
Query OK, 0 rows affected (0.03 sec) 

mysql> desc t7; 
+-------+---------------+------+-----+---------+-------+ 
| Field | Type          | Null | Key | Default | Extra | 
+-------+---------------+------+-----+---------+-------+ 
| id    | decimal(10,0) | YES  |     | NULL    |       | 
+-------+---------------+------+-----+---------+-------+ 
1 row in set (0.00 sec)

숫자 열의 확장 속성

  • auto_increment는 일반적으로 이 열에 대한 연속 정수 값을 자동으로 생성할 수 있는 기본 키에 사용됩니다.
mysql> create table t8(id int auto_increment,name varchar(20)); 
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key 

mysql> create table t8(id int primary key auto_increment,name varchar(20)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into t8 values(null,'yan1');-- 插入数据时不指定插入的值或者设置插入值 为null则会自动添加一个自增值 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t8 values(99,'yan1'); -- 如果插入数据时不指定对应的值,则自增长 max(id)+1;如果指定对应的值,则自增效果失效 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t8(name) values('yan1'); 
Query OK, 1 row affected (0.01 sec)

mysql> select * from t8;
+-----+------+ 
|  id | name | 
+-----+------+
| 1   | yan1 | 
| 99  | yan1 | 
| 100 | yan1 | 
+-----+------+ 
3 rows in set (0.00 sec)

AUTO_INCREMENT를 사용할 때 다음 사항에 유의해야 합니다.

1. AUTO_INCREMENT는 데이터 컬럼의 속성으로 정수형 데이터 컬럼에만 적용된다.

2. AUTO_INCREMENT 속성을 설정하는 데이터 컬럼은 양수 시퀀스여야 하므로 데이터 컬럼을
UNSIGNED로 선언하여 시퀀스의 수가 두 배가 될 수 있도록 해야 한다.

id int unsigned primary key auto_increment

3. AUTO_INCREMENT 데이터 열에는 일련 번호의 중복을 방지하기 위해 고유 인덱스가 있어야 합니다(즉, 기본 키 또는 기본 키의 일부임).
AUTO_INCREMENT 데이터 열에는 NOT NULL 속성이 있어야 합니다.

4. AUTO_INCREMENT 데이터 칼럼의 최대 개수는 칼럼의 데이터 타입에 따라 제한되는데, 예를 들어 TINYINT 데이터 칼럼의 최대 개수는
127개이며, UNSIGNED를 추가하면 최대 개수는 255개이다. 한도에 도달하면 AUTO_INCREMENT가 만료됩니다.

  • auto_incement가 상한에 도달하면 다음 id를 다시 신청할 때 얻은 값은 변경되지 않습니다. 중복 기본 키 값 오류
  • 일부 데이터가 삭제된 경우 auto_increment는 여전히 마지막 값부터 계산됩니다.

5. 전체 테이블을 삭제할 때 MySQL AUTO_INCREMENT는 1부터 번호를 다시 시작합니다. 이는 전체 테이블 작업을 수행할 때
MySQL이 실제로 이러한 최적화 작업을 수행하기 때문입니다. 먼저 데이터 테이블의 모든 데이터와 인덱스를 삭제한 다음 데이터 테이블을 다시 빌드합니다.

  • 테이블 이름에서 삭제; 테이블의 모든 데이터가 삭제되지만 auto_increment는 여전히 이전 카운트에 따라 데이터를 계속 생성합니다.
  • auto_increment가 처음부터 계산되어야 하는 경우 truncate table name을 사용하여 데이터를 삭제해야 합니다.


모든 데이터 행을 삭제하고 일련 번호 정보를 유지하려면 MySQL 최적화를 억제할 위치와 함께 삭제 명령을 사용할 수 있습니다. delete from table_name where 1;

방금 증가된 값을 얻으려면 last_insert_id()를 사용하십시오.

  • unsigned는 음수 값을 비활성화합니다.
  • zerofill 쿼리가 표시될 때 실제 데이터가 지정된 비트 폭보다 작으면 자동으로 0 값이 추가됩니다.
mysql> create table t9(id int(5) zerofill); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into t9 values(12); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from t9; 
+-------+ 
| id    | 
+-------+ 
| 00012 | 
+-------+ 
1 row in set (0.00 sec) 

mysql> insert into t9 values(123456); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from t9; 
+--------+ 
| id     | 
+--------+ 
| 00012  | 
| 123456 | 
+--------+ 
2 rows in set (0.00 sec)
  • default는 기본값을 설정하는 데 사용됩니다.

default는 데이터가 삽입되지 않은 경우에만 적용되며, 데이터가 삽입되면 null 값을 삽입해도 적용되지 않는다.

mysql> create table t10(id int default 0,name varchar(20)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into t10 values(11,'yan1');-- 指定对应的数据,则default无效 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t10 values(null,'yan1'); -- 指定对应的数据,则default无效,即 使设置的值为null 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t10(name) values('yan1'); -- 只有不针对这个列进行数据插入时 default才能生效 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from t10; 
+------+------+ 
| id   | name | 
+------+------+ 
| 11   | yan1 | 
| NULL | yan1 | 
| 0    | yan1 | 
+------+------+ 
3 rows in set (0.00 sec)

null은 무엇을 의미합니까

Null은 알 수 없는 데이터를 의미하며 빈 문자열도 아니고 특정 값도 아니며 어떤 값도
null 값과 비교할 수 없습니다. null은 불확실한 값을 의미하기 때문입니다. null 값의 진정한 비교는 특수 연산자 is null 또는
null이 아님을 사용해야 합니다.

mysql> select null=null; -- =表示等值比较 
+-----------+ 
| null=null | 
+-----------+ 
|      NULL | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> select null!=null; -- 比较不相等 
+------------+ 
| null!=null | 
+------------+ 
|       NULL | 
+------------+ 
1 row in set (0.00 sec) 

mysql> select null is null; 
+--------------+ 
| null is null | 
+--------------+ 
|            1 | 
+--------------+ 
1 row in set (0.00 sec) 

mysql> select null is not null;
+------------------+ 
| null is not null | 
+------------------+ 
|                0 | 
+------------------+ 
1 row in set (0.00 sec)

문자열 유형

char (n) 고정 길이 문자열, n 값은 최대 허용 길이를 나타내는 데 사용되며 값 범위는 0-255입니다.

  • 길이 제한은 중국어와 영어를 구분하지 않으며 최대 저장할 수 있는 문자 수를 나타냅니다.
  • 길이 함수를 사용하여 문자 수가 아닌 바이트 수를 가져옵니다. utf-8 인코딩에서 한자는 3바이트를 차지합니다.
mysql> create table c2(id char(5)); 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into c2 values("yan"); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into c2 values("中国人民好"); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into c2 values("中国人民好1"); 
ERROR 1406 (22001): Data too long for column 'id' at row 1

varchar(n) 가변 길이 문자열, n 값 범위는 0-65535입니다.

  • 실제로 얼마나 많은 문자가 저장되느냐에 따라 많은 위치를 차지하게 되며, 각 열이 차지하는 길이는 구체적인 내용에 따라 달라집니다.
create table t1(id varchar(20));

문자 및 varchar

  • char은 고정 길이에 속하고 varchar는 가변 길이에 속합니다. 가장 기본적인 선택 기준은 고정 길이는 char, 가변 길이는 varchar를 사용하는 것입니다.
  • char에 허용되는 최대 길이는 255이고 varchar에 허용되는 최대 길이는 65535입니다.
  • 저장된 문자열의 길이가 크게 변하지 않는다면 char를 우선적으로 사용하는 것이 좋습니다. char은 varchar보다 낫습니다.
  • Char는 계산에서 공백을 자동으로 제거합니다. varchar는 공백을 제거하지 않지만 문자열을 비교할 때 비교하기 전에 공백을 제거합니다.
    데이터를 삽입할 때 시스템은 문자열에서 기본 중복 공백을 자동으로 제거합니다.

대형 개체 유형 Lob

큰 개체 유형은 텍스트 유형과 이진 유형의 두 가지 범주로 나눌 수 있습니다.

  • BLOB는 가변 길이 데이터를 수용할 수 있는 이진 대형 객체로 tinyblob, blob,
    mediumblob, longblob으로 나뉩니다. 일반적으로 사운드, 이미지, 비디오 등과 같은 이진 데이터를 저장하는 데 사용됩니다.
  • Text는 가변 길이 데이터를 수용할 수 있는 큰 텍스트 객체로 tinytext, text, mediumtext,
    longtext로 구분되며 일반적으로 소설, 상품 소개서 등 텍스트 형태의 데이터를 저장하는 데 사용됩니다.
mysql> create table c9(id text); 
Query OK, 0 rows affected (0.02 sec)

mysql> create table c8(id blob); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into c9 values("Abc"); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into c8 values("Abc"); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from c9 where id='abc'; 
+------+ 
| id   | 
+------+ 
| Abc  | 
+------+ 
1 row in set (0.00 sec) 

mysql> select * from c8 where id='abc'; 
Empty set (0.00 sec)

둘 사이의 차이점:

  • Blob은 가변 길이 데이터를 보유할 수 있고 대소문자를 구분하는 이진 유형이며, 텍스트는 대소문자를 구분하지 않는 BLOB입니다.
유형 이름 허용되는 최대 길이 설명하다
아주 작은 문자 0-255 짧은 텍스트 문자열
텍스트 0-65535 긴 텍스트 문자열
중간 텍스트 16M 중간 길이의 긴 텍스트 문자열
긴 문장 4G 매우 큰 텍스트 데이터
아주 작은 덩어리 0-255 255개 이하의 긴 이진 문자열
얼룩 0-65535 바이너리 형식의 긴 텍스트 문자열
미디엄블롭 16M 중간 길이의 이진 긴 텍스트 문자열
폐 얼룩 4G 매우 큰 이진 데이터

날짜 시간 유형

create table dt1(id date); 

insert into dt1 values('1989-2-3');

특수 시간은 타임스탬프 유형입니다.

create table dt2(id timestamp default current_timestamp,name varchar(20)); 

mysql> insert into dt3(name) values('yan1'); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from dt3; 
+---------------------+------+ 
| id 				  | name | 
+---------------------+------+ 
| 2022-04-17 15:07:33 | yan1 | 
+---------------------+------+ 
1 row in set (0.00 sec)

타임스탬프 필드 정의는 주로 두 가지 유형의 작업에 영향을 미칩니다.

  • 레코드 삽입 시 타임스탬프 필드에 DEFAULT CURRENT_TIMESTAMP가 포함되며, 레코드 삽입 시 특정 시간 데이터를 지정하지 않은 경우 타임스탬프 필드의 값을 현재 시간으로 설정
  • 레코드 업데이트 시 타임스탬프 필드에 ON UPDATE CURRENT_TIMESTAMP가 포함되며, 레코드 업데이트 시 특정 시간 데이터를 지정하지 않은 경우 타임스탬프 필드의 값을 현재 시간으로 설정
  • 필드가 타임스탬프 DEFAULT CURRENT_TIMESTAMP ON UPDATE
    CURRENT_TIMESTAMP로 정의되면 삽입 또는 업데이트 시 필드가 값을 지정하지 않는다는 의미이며 현재 시간이 할당됩니다.

시스템 함수 now()는 시스템의 현재 시간을 가져올 수 있습니다.

select now();

create table t8(id int, name varchar(32), bdate datetime default now());

유형 설명

유형 이름 설명하다 체재
날짜 날짜 유형, 유효한 범위는 시, 분, 초를 제외한 1000-9999년입니다. 3B,yyyy-MM-dd
시간 시간 유형, 유효한 범위는 -838~838시간이며 일반적으로 시간 값 또는 기간을 나타내는 데 사용됩니다. 연월일을 포함하지 않음 3B,HH:mm:ss
년도 연도 유형, 1901년부터 2155년까지의 유효 범위 1B,yyyy
날짜 시간 날짜와 시간을 포함하는 datetime 유형은 초까지 정확할 수 있으며 유효 범위는 1000년에서 9999년까지입니다. 특정 저장 시간은 시간대와 관련이 없습니다. MySQL 5.6.4부터는 초의 소수 부분을 포함할 수 있으며 정밀도는 최대 마이크로초(6자리)입니다. 비소수부 5B+ 소수부 0-3B, 소수부가 있으면 소수점 이하 자릿수로 변경 yyyy-MMdd HH:mm:ss
타임스탬프 타임스탬프 유형은 초 단위까지 정확할 수 있으며, 유효 시간은 1970년부터 2038년까지입니다. 동시에 수정된 시간의 자동 저장, 시간대 데이터 저장, 밀리초 단위의 실제 저장을 지원합니다. MySQL 5.6.4 이상 버전에서 타임스탬프 타입 데이터는 마이크로초 단위의 가장 높은 정확도로 저장할 수 있으며, 타임스탬프(N)N의 값 범위는 0-6이다. 비소수 부분 4B+ 소수 부분 0-3B, 기본 표시 형식은 YYYY-MM-ddHH:mm:ss입니다.

컬렉션 및 열거 유형

  • 컬렉션 유형 설정, 여러 컬렉션 구성원을 설정할 수 있으며 여러 컬렉션 구성원에서 여러 데이터를 선택하여 삽입할 수 있습니다.
create table set1(id int,hobby set('抽烟','喝酒','烫头')); 

insert into set1 values(1,''); -- 允许,同时允许插入null
insert into set1 values(1,'烫头,抽烟'); -- 没问题 
insert into set1 values(1,'烫头,喝酒'); -- 没有问题,但是入库时会自动排序
insert into set1 values(1,'烫头,抽烟,扣脚'); -- 报错,因为其中一个值不在set定义种 

insert into set1 values(1,'抽烟,抽烟');-- 实际上只插入一个值,也就是会自动去除重复值
  • enum 열거형은 선택이 허용되는 여러 값을 설정할 수 있으며 열에는 특정 열거형 멤버 값만 할당할 수 있습니다.
create table enum1(id int,sex enum('男','女','不确定')); 

insert into enum1 values(1,''); -- 报错,但是允许插入null
insert into enum1 values(1,'男'); 

insert into enum1 values(2,'男,女'); -- 报错

비트 유형

비트를 직접 사용하면 기본 비트(1)

bit(1)은 이진 비트를 저장할 수 있으며 0 또는 1만 저장할 수 있으며 n의 최대 상한은 64임을 의미합니다.

bit(8)은 8개의 이진 비트 값을 저장할 수 있음을 의미하며 값 범위는 0에서 255까지입니다.

요약하다

  • 데이터 타입을 정의한다는 것은 컬럼을 정의하는 것이고, 데이터 타입은 데이터의 특성을 결정한다 [도메인 무결성]
  • 데이터형은 크게 문자열형, 고정소수점수 및 부동소수점수형, 날짜형, 대형객체형으로 구분 [주의해서 사용]
  • 데이터 유형은 다른 스토리지 엔진에서 다르게 동작합니다.
  • 데이터가 사용하는 데이터 유형은 비즈니스 요구 사항 및 해당 데이터 유형 특성에 따라 선택되며 너무 복잡한 데이터 유형을 사용하지 않는 것이 좋습니다.

무결성 제약

저장된 데이터가 완전하고 유효한지 확인하고 불필요한 데이터 저장을 방지하기 위해 DBMS는 삽입된 데이터에 대한 검사를 제공합니다.

  • 개발자는 해당 규칙을 지정하고 DBMS는 확인을 담당하며, 잘못된 데이터를 삽입하려고 시도하면 자동으로 오류를 보고하고 삽입을 거부합니다.
  • 실제로 6가지 종류의 제약이 있으며 무결성 제약의 3가지 범주로 나눌 수 있습니다. 일부 외국인의 책에서는 네 가지 유형 [도메인 무결성]을 제안합니다.
    • 기본 키 제약 조건으로 구현된 엔터티 무결성
    • 외래 키 제약 조건으로 구현되는 참조 무결성
    • 다른 4가지 제약 조건으로 구현된 사용자 정의 무결성
  • 실제 개발에서는 기본 키 제약 조건을 제외하고 다른 제약 조건이 추가되지 않습니다. 다른 데이터 검사는 일반적으로 코드 테스트의 편의를 위해 애플리케이션 구현에 따라 다릅니다.

1. Null이 아닌 제약 조건, 지정된 열 값은 비어 있을 수 없습니다.

create table t1(id int not null); --不允许id列值为null 

create table t2(id int null); -- 允许id列值为null 
create table 3(id int);-- 允许id列值为null

2. 기본 제약 기본값

일반적으로 기본 제약 조건은 null이 아닌 제약 조건과 함께 사용되는 경우가 많으며 데이터가 삽입되지 않으면 기본 값이 적용됩니다.

create table t1(id int not null default 0);

create table t2(id datetime default now()); -- 正确的,过去只有timestamp default current_timestamp

3. 엔터티 무결성이라고도 하는 기본 키 제약 조건은 데이터가 반복적으로 저장되는 것을 허용하지 않습니다.

  • 기본 키는 데이터 행을 고유하게 식별할 수 있습니다.
  • 기본 키 제약 조건의 의미는 null이 아니며 고유합니다.
create table t1(id int primary key,....); 

create table t2( 
	id int not null,... 
	primary key(id) -- 注意这里的主键约束允许使用复合主键,多个列构成的主键 
);

InnoDB 스토리지 엔진을 사용할 때 데이터 테이블에 기본 키 세트가 없으면 Innodb는 테이블에 대해 길이가 6바이트인 보이지 않는 기본 기본 키 row_id를 설정합니다. Innodb는 기본 키 없이 모든 데이터 테이블에서 사용되는 글로벌 dict_sys.row_id 값을 유지합니다. 기본 키 없이 데이터 테이블에 데이터 행을 삽입하면 현재 dict_sys.row_id 값이 1씩 증가합니다.

실제 row_id 값이 저장될 때 데이터 길이는 8바이트이지만 Innodb는 마지막 6바이트만 사용합니다. 그러면 row_id 값은
데이터 테이블에 기록될 때 다음과 같은 두 가지 특성을 갖습니다.

1. 테이블에 기록된 row_id의 값 범위는 0-2^48-1입니다.

2. row_id의 값이 2^48이고 데이터가 삽입되면 row_id의 마지막 6바이트 값은 모두 0이다.

즉, row_id의 값이 2^48승 -1에 도달하면 데이터가 다시 삽입되고 다음 값이 0이 된 다음 주기가 시작됩니다. 그러나
사용자 지정 기본 키와 달리 row_id로 식별되는 기본 키는 고유성 제약이 없으며 삽입된 데이터의 row_id 값이 테이블에 이미 존재하는 경우 작성된 ​​데이터가 기존 데이터를 "조용히" 덮어씁니다.

기본키는 테이블에 최대한 많이 설정해야 하고, 기본키는 최대한 bigint 타입을 사용해야 합니다 상한은 21억도 가능합니다 예를 들어 워크래프트에서는 row_id의 상한이 있긴 하지만 281조로 높으면 데이터를 덮는 것은 명백히 용납할 수 없습니다
.

4. 고유 제약 조건 고유

  • 고유 제약 조건이 추가된 열에는 중복 값이 ​​허용되지 않습니다.
  • null 값 제약 조건이 있을 수 없으며 null에 대한 고유성을 확인할 수 없습니다.
create table t1(id int unique,name varchar(20)); 

insert into t1 values(1,'zhangsan'); 

insert into t1(name) values('zhao4');-- id为null 
insert into t1(name) values('zhao4');-- id为null,两次null并不会报错 

insert into t1 values(1,'li4'); -- 报错

mysql> create table t23( 
	-> id int, 
	-> name varchar(32), 
	-> unique(id,name)); -- 多个列的组合不允许重复,单一列允许重复

5. 참조 무결성이라고도 하는 외래 키 제약 조건

6. 제약 조건 확인

mysql> create table t24( 
	-> id boolean default 1, 
	-> check(id in(1,0)));

DDL 테이블 작업

작업 생성

create table tb_student( 
	id bigint primary key auto_increment, 
	name varchar(10) not null comment '说明信息', -- comment用于对表或者列添加说 明信息
	birth date, 
	sex boolean default 1, \
	salary numeric(8,2) 
)engine=innodb default charset utf8;

데이터가 아닌 테이블 구조만 복제하여 다른 테이블과 동일한 구조의 테이블을 빠르게 생성

create table 新表名称 like 已经存在的旧表名称;

create table 新表名称 as 
	select id emp_no,name emp_name from 克隆表的名称 
	where 1=2;

테이블 구조 수정, 구문 규칙은 alter table테이블 이름 입니다.add/drop/modify 列名称 [类型 约束]

alter table tb_student add class_name varchar(20) default '软件19'; -- 新增列 

alter table tb_student drop column salary; -- 删除指定列 

alter table tb_student modify class_name int; -- 修改列定义时,要求已经存在的数据必须 符合规则,否则修改失败。modify一般用于修改列的数据类型和长度,但是如果有数据则必须和目标类型匹 配,否则修改失败

열 이름 수정

alter table 表名称 change 旧有列名称 新列名称 类型 约束;

테이블 삭제drop table 表名称

drop table tb_student; 

drop table if exists tb_student;

현재 데이터베이스의 모든 테이블 보기

show tables;

show tables from sys;

테이블 구조 보기

desc 表名称;

SQL 문을 보고 테이블을 생성합니다.

show create table tb_student;

다른 작업

테이블 이름 바꾸기RENAME TABLE emp TO myemp;
ALTER table dept RENAME [TO] detail_dept;

빈 테이블

TRUNCATE TABLE 문: 테이블의 모든 데이터를 삭제하고 테이블의 저장 공간을 해제

TRUNCATE TABLE detail_dept;TRUNCATE 문은 롤백할 수 없지만 DELETE 문은 데이터를 삭제하는 데 사용할 수 있으며 롤백할 수 있습니다.

Alibaba 개발 사양:
[참고] TRUNCATE TABLE은 DELETE보다 빠르고 시스템 및 트랜잭션 로그 리소스를 덜 사용하지만 TRUNCATE는
트랜잭션이 없으며 사고를 유발할 수 있는 TRIGGER를 트리거하지 않으므로 개발 시 이 문을 사용하지 않는 것이 좋습니다. 암호.
설명: TRUNCATE TABLE은 WHERE 절이 없는 DELETE 문과 기능적으로 동일합니다.

추천

출처blog.csdn.net/qq_39756007/article/details/126962927