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