22-05-10 西安 mysql基础篇(02) 修改表 、修改列、commit和rollback、表数据之增删改 DML 、列级约束、表级约束
我們的情緒背后藏著動(dòng)機(jī),動(dòng)機(jī)總是正面的,因?yàn)橐庾R(shí)從來不會(huì)傷害自己,只是誤以為某些行為可以滿足自己的這份動(dòng)機(jī)。
結(jié)果去重?distinct
select distinct 字段列表 from 表名稱 【where 條件】;?創(chuàng)建表和修改表
創(chuàng)建表create?table
要自增的列必須是主鍵
1.?新建表
# 新建表 CREATE TABLE dept1(`id` INT(7),`name` VARCHAR(25) -- name是關(guān)鍵字可以用`` );2. 基于現(xiàn)有表創(chuàng)建新表? ?as關(guān)鍵字
# 基于現(xiàn)有表創(chuàng)建新表(相當(dāng)于表的復(fù)制) CREATE TABLE dept2 AS SELECT * FROM `departments`;第2種創(chuàng)建表的方式,不想要表數(shù)據(jù)時(shí),只要表結(jié)構(gòu) 可以加一個(gè) where 1=2;
修改表alter table
1.添加列,有無默認(rèn)值 add
2.修改列的類型和長度。modify
3.重命名列 ?change [也可以修改列的類型]
4.刪除列,drop?
5.重命名表 rename
清空和刪除表
清空表 truncate 【表結(jié)構(gòu)還存在,ddl,這個(gè)刪除數(shù)據(jù)刪了就徹底完蛋,不可以回滾】
truncate清空表原理:會(huì)刪除原來的表,再重新創(chuàng)建一張表刪除表 drop 【?DROP則刪除整個(gè)表(結(jié)構(gòu)和數(shù)據(jù))】
delete from表名? ?刪除表中數(shù)據(jù)[可以用rollback回滾表中數(shù)據(jù)]
提交和回滾
- commit 提交,對(duì)數(shù)據(jù)的操作永久生效
- rollback 回滾,本次提交后就沒辦法回滾了,默認(rèn)回滾到上一次commit。DML操作了但是沒提交可以回滾
事務(wù):一個(gè)commit和一個(gè)rollback的一個(gè)或多個(gè)dml稱為一個(gè)事務(wù)
MySQL默認(rèn)DML語句自動(dòng)提交。
關(guān)閉自動(dòng)提交 SET AUTOCOMMIT = FALSE;
ddl不能回滾,即每一個(gè)ddl是一個(gè)事務(wù)。dml可以回滾【如上面提到的2種刪除表數(shù)據(jù)的區(qū)別】
事務(wù)詳細(xì)參考:
22-05-13 西安 jdbc(03) 事務(wù)的ACID屬性、并發(fā)問題、隔離級(jí)別;事務(wù)傳播行為、本地事務(wù)_£小羽毛的博客-CSDN博客
數(shù)據(jù)處理之增刪改?DML?
向表中插入空值
隱式方式: 在列名表中省略該列的值
顯示方式: 在VALUES 子句中指定空值
1、添加一條記錄到表"anchor"
#值列表中的值的順序、類型、個(gè)數(shù)必須與表結(jié)構(gòu)一一對(duì)應(yīng) INSERT INTO anchor VALUES (NULL,'騷白','斗魚'); #也可以這樣寫 INSERT INTO anchor (`name`,plat) VALUES ('純皇','斗魚');2、添加多條記錄到表"anchor"
每一個(gè)值列表直接使用逗號(hào)分隔
#值列表中的值的順序、類型、個(gè)數(shù)必須與(字段列表)一一對(duì)應(yīng) INSERT INTO anchor (`name`,plat) VALUES('張大仙','虎牙'), ('慢慢','斗魚');#一個(gè)insert語句有幾個(gè)(值列表)就表示添加幾行記錄 INSERT INTO anchor VALUES (NULL,'慕少','花樣'), (NULL,'二蛋','虎牙');3、帶條件修改
不帶條件修改,會(huì)對(duì)表中所有行修改,慎重!!!
#不帶條件修改,會(huì)對(duì)表中所有行修改,慎重 UPDATE anchor SET `name`='韓涵',plat='虎牙' WHERE id=5;4、刪除表數(shù)據(jù)
DELETE FROM anchor WHERE id=2; -- 刪除現(xiàn)存數(shù)據(jù) DELETE FROM [不寫where會(huì)清空表] 可以回滾 DELETE FROM anchor;約束:對(duì)表中數(shù)據(jù)做限制
約束是表級(jí)的強(qiáng)制規(guī)定
方式1:可以在創(chuàng)建表時(shí)規(guī)定約束(通過 CREATE TABLE 語句),
方式2:或者在表創(chuàng)建之后也可以(通過 ALTER TABLE 語句)
1.非空約束? ? ?
not null 聲明列的同時(shí)去指定約束,叫列級(jí)約束。not null只支持列級(jí)約束
mysql注意:not null約束后,在插入數(shù)據(jù)時(shí)顯示加不進(jìn)去,隱式可以加null可以所有的類型的值都可以是null,包括int、float等數(shù)據(jù)類型? ? ? ? ? ? ? ? ? ? ? ? ? ?
-- NOT NULL 非空約束,規(guī)定某個(gè)字段不能為空 CREATE TABLE emp1(id INT(10),`name` VARCHAR(20) NOT NULL );-- 對(duì)現(xiàn)有表添加非空約束 ALTER TABLE emp2 MODIFY NAME VARCHAR(20) NOT NULL;-- 刪除非空約束 ALTER TABLE emp2 MODIFY NAME VARCHAR(20) NULL;2.唯一約束 unique
列都聲明好了,再加約束。是表級(jí)約束,constraint
-- UNIQUE 唯一約束,規(guī)定某個(gè)字段在整個(gè)表中是唯一的 CREATE TABLE emp3(id INT(10),NAME VARCHAR(20),phone VARCHAR(30),CONSTRAINT emp3_phone_un UNIQUE(phone) -- 起名--給唯一約束起名emp3_phone_un );-- 表已經(jīng)創(chuàng)建好添加唯一約束 ALTER TABLE emp3 ADD CONSTRAINT emp3_name_un UNIQUE(NAME);-- 刪除唯一約束 drop index[mysql會(huì)為唯一約束列添加索引] ALTER TABLE emp3 DROP INDEX emp3_name_un;3.主鍵約束【非空并且唯一】
primary key 可以鎖定唯一一條數(shù)據(jù),
-- 主鍵(非空且唯一),通常利用逐漸鎖定一條數(shù)據(jù)從 -- PRIMARY KEY ?添加主鍵約束方式1 CREATE TABLE emp4(id INT(10) PRIMARY KEY,NAME VARCHAR(20) );-- 添加主鍵約束方式2 CREATE TABLE emp5(id INT(10),NAME VARCHAR(20),CONSTRAINT emp5_id_pk PRIMARY KEY(id) );-- 添加主鍵約束方式3 ALTER TABLE emp6 ADD CONSTRAINT emp6_id_pk PRIMARY KEY(id);-- 刪除主鍵約束 【只把唯一約束刪除了,沒有刪除非空約束】 ALTER TABLE emp6 DROP PRIMARY KEY;4.外鍵約束
某字段關(guān)聯(lián)另外一個(gè)表的主鍵
出現(xiàn)在外鍵表【有外鍵限制的表】中的數(shù)據(jù)一定要出現(xiàn)在主鍵表
在多方表中定義外鍵,指向一方表的主鍵
-- FOREIGN KEY 外鍵:通常關(guān)聯(lián)另一個(gè)表的主鍵,出現(xiàn)在外鍵表中的數(shù)據(jù),一定出現(xiàn)在主鍵表中 FOREIGN KEY: 在表級(jí)指定子表中的列 REFERENCES: 標(biāo)示在父表中的列CREATE TABLE dept1(dept_id INT(10) PRIMARY KEY,dept_name VARCHAR(20) );CREATE TABLE emp7(id INT(10) PRIMARY KEY,NAME VARCHAR(20),depart_id INT(10),CONSTRAINT emp7_departId_fk FOREIGN KEY(depart_id) REFERENCES dept1(dept_id)-- ON DELETE CASCADE -- (級(jí)聯(lián)刪除): 當(dāng)父表中的列被刪除時(shí),子表中相對(duì)應(yīng)的列也被刪除ON DELETE SET NULL -- (級(jí)聯(lián)置空): 子表中相應(yīng)的列置空 );#添加外鍵約束 ALTER TABLE emp7 ADD CONSTRAINT emp7_depart_id_fk FOREIGN KEY(depart_id) REFERENCES dept1(dept_id);#刪除外鍵約束 ALTER TABLE emp7 DROP FOREIGN KEY emp7_departId_fk;5.約束等級(jí)
約束等級(jí),沒有設(shè)置,則默認(rèn)不允許刪除或修改操作
在從表上設(shè)置主外鍵依賴關(guān)系,設(shè)置約束等級(jí)時(shí)建議使用可視化,如下:
?1.在倆張表中添加數(shù)據(jù),不加級(jí)聯(lián)置空和級(jí)聯(lián)刪除,普通主外鍵的情況下
?
-- 因?yàn)橹魍怄I關(guān)系直接刪除會(huì)報(bào)錯(cuò) DELETE FROM dept1 WHERE dept_id=102.on delete set null; 級(jí)聯(lián)置空 平和。刪除主表數(shù)據(jù)時(shí),
DELETE FROM dept1 WHERE dept_id=103.on delete cascade [.級(jí)聯(lián)刪除] ? 危險(xiǎn)
?
6.檢查約束
mysql5.7不支持check約束,不支持不是用的時(shí)候報(bào)錯(cuò),是不起作用,mysql8.0才有效果。
-- CHECK 檢查約束 MySQL 8.0 CREATE TABLE emp8(id INT(10),NAME VARCHAR(20),salary DOUBLE(10, 2),CONSTRAINT emp8_salary_ck CHECK(salary > 3000) );此時(shí),執(zhí)行如下sql會(huì)報(bào)錯(cuò)
INSERT INTO emp8 VALUES(101, '張三', 1000);7.default約束
給某個(gè)字段/某列指定默認(rèn)值,一旦設(shè)置默認(rèn)值,在插入數(shù)據(jù)時(shí),如果此字段沒有顯示賦值,則賦值為默認(rèn)值
創(chuàng)建表:
CREATE TABLE test_default( id INT, last_name VARCHAR(15), salary DECIMAL(10,2) DEFAULT 2000 )DESC test_default;測試:
INSERT INTO test_default VALUES(1,'tom',2500);-- 如果salary字段沒有顯示賦值,則賦值為默認(rèn)值 INSERT INTO test_default (id,last_name) VALUES(1,'tom');總結(jié)
以上是生活随笔為你收集整理的22-05-10 西安 mysql基础篇(02) 修改表 、修改列、commit和rollback、表数据之增删改 DML 、列级约束、表级约束的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bert 句向量 的 各向异性问题 及与
- 下一篇: 【MATLAB appdesigner】