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