mysql约束类型 A P_mysql笔记: 数据类型、约束、范式
登陸mysql
# mysql -uroot -p123456
# 顯示數據庫
SHOW DATABASES;
# 創建數據庫
CREATE DATABASE test;
# 顯示數據庫中的表
SHOW TABLES;
# 創建pet表
CREATE TABLE pets (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
) character set = utf8;
# 顯示表結構
DESC?pets;
#?插入數據
INSERT INTO?pets?VALUES?('旺財2',?'周星馳2',?'a',?'a',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財3',?'周星馳3',?'b',?'b',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財4',?'周星馳4',?'c',?'c',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財5',?'周星馳5',?'d',?'d',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財6',?'周星馳6',?'e',?'e',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財7',?'周星馳7',?'f',?'f',?'1990-01-01',?NULL);
INSERT INTO?pets?VALUES?('旺財8',?'周星馳8',?'g',?'g',?'1990-01-01',?NULL);
# 查詢
SELECT * FROM pets;
#?刪除數據
DELETE FROM?pets?WHERE?name='旺財2';
#?修改數據
UPDATE?pets?SET?name='旺旺財'?WHERE?owner='周星星';
常用數據類型
# 數值
# TINYINT ? ? ? ? ?1 字節 ? ?小整數值
# # SMALLINT ? ? ? 2 字節 ? ?大整數值
# MEDIUMINT ? ? ? ?3 字節 ? ?大整數值
# INT或INTEGER ?4 字節 ? ?大整數值
# BIGINT ? ? ? ? ?8 字節 ? ?極大整數值
# FLOAT ? ? ? ? ? ?4 字節 ? ?單精度
# DOUBLE ? ? ? ? ? 8 字節 ? ?雙精度
# DECIMAL ?對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2
# 日期/時間
# DATE 3 ?1000-01-01/9999-12-31 ?YYYY-MM-DD 日期值
# TIME 3 ?'-838:59:59'/'838:59:59' ? HH:MM:SS ? 時間值或持續時間
# YEAR 1 ?1901/2155 ?YYYY ? 年份值
# DATETIME 8 ?1000-01-01 00:00:00/9999-12-31 23:59:59 ? ?YYYY-MM-DD HH:MM:SS ? ?混合日期和時間值
# TIMESTAMP ? ?4 ? 1970-01-01 00:00:00/2038 ? ?結束時間是第 2147483647 秒
# ? ? ? ? 北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07
# ? ? ? ? YYYYMMDD HHMMSS 混合日期和時間值,時間戳
# 字符串
# CHAR 0-255字節 ? ?定長字符串
# VARCHAR ?0-65535 字節 變長字符串
# TINYBLOB 0-255字節 ? ?不超過 255 個字符的二進制字符串
# TINYTEXT 0-255字節 ? ?短文本字符串
# BLOB 0-65 535字節 二進制形式的長文本數據
# TEXT 0-65 535字節 長文本數據
# MEDIUMBLOB ? 0-16 777 215字節 二進制形式的中等長度文本數據
# MEDIUMTEXT ? 0-16 777 215字節 中等長度文本數據
# LONGBLOB 0-4 294 967 295字節 ?二進制形式的極大文本數據
# LONGTEXT 0-4 294 967 295字節 ?極大文本數據
mysql建立表約束
# 主鍵約束
CREATE table user (
id int primary key,
name varchar(20)
) character set = utf8;
INSERT INTO user values(1, '張三');
# 聯合主鍵
# id和name在一起不重復就行
CREATE table user2 (
id int,
name varchar(20),
password varchar(20),
primary key (id, name)
) character set = utf8;
INSERT into user2 values (1, '張三', '123');
INSERT into user2 values (2, '張三', '123');
INSERT into user2 values (1, '李四', '123');
# id 和 name與第一項相同
INSERT into user2 values (1, '張三', '123');
# 聯合組件任何一項都不能為NULL
INSERT into user2 values (NULL, '張三', '123');
# 自增約束
CREATE table user3 (
id int primary key auto_increment,
name varchar(20)
) character set = utf8;
INSERT INTO user3 (name) values ('張三'); # 連續執行三次
# 忘記創建組件約束的情況
CREATE table user4 (
id int,
name varchar(20)
) character set = utf8;
ALTER table user4 add primary key auto_increment(id); # 補充添加自增主鍵約束
ALTER table user4 drop primary key; # 刪除主鍵約束
ALTER table user4 modify id int primary key auto_increment; # 修改某一個字段為自增主鍵
desc user4;
# 唯一約束
# 約束該字段的值不能重復
CREATE table user5 (
id int,
name varchar(20)
) character set = utf8;
alter table user5 add unique(name);
INSERT into user5 (name) values ('張三'); # 連續執行兩次
CREATE table user6 (
id int,
name varchar(20),
unique(name)
) character set = utf8;
CREATE table user7 (
id int,
name varchar(20) unique
) character set = utf8;
# 聯合唯一約束
CREATE table user8 (
id int,
name varchar(20),
unique(id, name)
) character set = utf8;
# 刪除唯一約束
alter table user7 drop index name;
# 添加唯一約束
alter table user7 modify name varchar(20) unique;
# 非空約束
CREATE table user9 (
id int,
name varchar(20) not null
) character set = utf8;
# 默認約束
# 當我們插入字段的時候,如果沒有傳值,就會用默認約束
CREATE table user10 (
id int,
name varchar(20) not null,
age int default 10
) character set = utf8;
# 外鍵約束
# 涉及到兩個表:父表、子表
CREATE table classes(
id int primary key,
name varchar(20)
) character set = utf8;
CREATE table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
) character set = utf8;
INSERT INTO classes values (1, '一班');
INSERT INTO classes values (2, '二班');
INSERT INTO classes values (3, '三班');
INSERT INTO classes values (4, '四班');
INSERT INTO students values (1001, '張三', 1);
INSERT INTO students values (1002, '李四', 2);
INSERT INTO students values (1003, '王五', 3);
INSERT INTO students values (1004, '趙六', 4);
# id 為5的班級不存在,所以報錯
INSERT INTO students values (1005, '錢七', 5);
# 不能刪除父表中的數據,因為這個數據子表要關聯
DELETE FROM classes WHERE id = 4;
數據庫的三大設計范式
# 1NF: 數據表中的所有字段都是不可分割的原子值?
CREATE table student2 (
id int primary key,
name varchar(20),
address varchar(30)
) character set = utf8;
INSERT INTO student2 VALUES(1, '張三', '中國遼寧省沈陽市高新區...');
INSERT INTO student2 VALUES(2, '李四', '中國吉林省長春市高新區...');
INSERT INTO student2 VALUES(3, '王五', '中國黑龍江省哈爾濱市高新區...');
# 中國遼寧省沈陽高新區... 這個字段值是可以繼續拆分的:中國=>遼寧省=>沈陽市=>高新區...
# 修改后
CREATE table student3 (
id int primary key,
name varchar(20),
country varchar(20),
province varchar(20),
city varchar(20),
detail varchar(60)
) character set = utf8;
INSERT INTO student3 VALUES(1, '張三', '中國', '遼寧省', '沈陽市', '高新區...');
INSERT INTO student3 VALUES(2, '李四', '中國', '吉林省', '長春市',' 高新區...');
INSERT INTO student3 VALUES(3, '王五', '中國', '黑龍江省', '哈爾濱市', '高新區...');
# 設計的越詳細,對于某些實際操作可能越好,但是不一定都是好處
# 具體要根據項目的需求而定
# 2NF:必須滿足1NF的前提下,除主鍵外的第一列都必須滿足依賴與主鍵。
# 如果要出現不完全依賴,只可能發生在聯合主鍵的情況下。
CREATE TABLE orders(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id, customer_id)
) character set = utf8;
# 問題?
# 除主鍵以外的其他列,只依賴與主鍵的部分字段。
# 所以上面的例子需要拆表:
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int
) character set = utf8;
CREATE TABLE product(
id int primary key,
name varchar(20)
) character set = utf8;
CREATE TABLE customer(
id int primary key,
name varchar(20)
) character set = utf8;
# 分成三個表之后,就滿足第二范式
# 3NF:必須滿足2NF,除主鍵列的其他列之間不能有傳遞依賴關系。
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
) character set = utf8;
# 修改為:
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int
) character set = utf8;
CREATE TABLE customer(
id int primary key,
name varchar(20),
phone varchar(15)
) character set = utf8;
# 總結:
# 也就是在每列不能拆分的情況下(1NF),
# 其他列必須依賴主鍵的全部(2NF),
# 且只依賴于主鍵的全部(3NF)
總結
以上是生活随笔為你收集整理的mysql约束类型 A P_mysql笔记: 数据类型、约束、范式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dedecms 系统迁移及问题
- 下一篇: eclipse maven打包_mave