MySQL自增列的步长问题
MySQL自增列的步長(zhǎng)問(wèn)題
唯一索引和聯(lián)合唯一
外鍵的變種
SQL數(shù)據(jù)行的增刪改查
視圖
觸發(fā)器
函數(shù)
存儲(chǔ)過(guò)程
事務(wù)
游標(biāo)
動(dòng)態(tài)執(zhí)行SQL(防SQL注入)
1.MySQL自增列的步長(zhǎng)問(wèn)題:
1.基于會(huì)話級(jí)別(單次登陸狀態(tài)下):
show session variables like 'auto_inc%'; #查看自增長(zhǎng)的默認(rèn)步數(shù),一般為1
set session auto_increment_increment=2; #設(shè)置自增長(zhǎng)會(huì)話步長(zhǎng)為2
set session auto_increment_offset=10; #設(shè)置默認(rèn)自增長(zhǎng)初始值
2.基于全局級(jí)別(所有用戶生效):
show global variables like 'auto_inc%'; #查看全局變量中的自增長(zhǎng)的默認(rèn)步長(zhǎng)
set global auto_increment_increment=2; #設(shè)置全局會(huì)話步長(zhǎng)
set global auto_increment_offset=10; #設(shè)置全局自增長(zhǎng)初始值
2.唯一索引和聯(lián)合唯一:
create table t1(
id int,
num int,
name char
unique uql (num) #唯一索引
unique uql (num, name) #聯(lián)合唯一
);
唯一索引和主鍵 的共同點(diǎn):
1.都有加速查找的功能;
2.都是唯一,不能重復(fù)
唯一索引和主鍵的不同點(diǎn):
主鍵既不能重復(fù)也不能為空;
而唯一索引不能重復(fù),但是可以有值為空,比如聯(lián)合索引中可以設(shè)置一個(gè)值為null
3.外鍵的變種:
1.一對(duì)一:博客用戶表
2.一對(duì)多:百合網(wǎng)相親記錄表
3.多對(duì)多:用戶主機(jī)關(guān)系表
4.SQL數(shù)據(jù)行的增刪改查:
增:
insert into test(name, age) values('name', 18);
insert into test(name, age) values('name1', 18),('name2', 18); #一次性插入多個(gè)值
insert into test(name, age) select name,age from test1; #把某張表中的數(shù)據(jù)插入
刪:
delete from test;
delete from test where id>2 and name='name1';
改:
updata test set name='name2',age=19 where id>12 and name='name1';
查:
select * from test;
select id,name from test where id>2;
select name,age,123 from test;
select name as rname from test;
select * from test where id in (1,3,5,7);
select * from test where id in (select id from test1);
select * from test where id between 5 and 9; #閉區(qū)間,左右都可以取到
通配符
select * from test where name like 'name%'; %匹配無(wú)數(shù)字符;_匹配一個(gè)字符
分頁(yè)
select * from test limit 10; 取前十條
select * from test limit 0,10; 表示從0開(kāi)始,取0后面的10條
select * from test limit 10 offset 20; 表示從20開(kāi)始,取20后的前10條
排序
select * from test order by id desc; id從大到小排列
select * from test order by id asc; id從小到大排列
select * from test order by age desc, id asc; 多個(gè)不同排序
select * from test order by desc limit 10; 取后十條
分組(聚合函數(shù):count,max,min,sum,avg求平均值)
select max(id),id from test group by sex; 如果遇到相同的sex,只會(huì)取最大id的
select count(id),id from test group by sex; 計(jì)數(shù)
select count(id) as count,id form test group by sex;
select count(id),id from test group by sex having count(id)>2; 對(duì)于聚合函數(shù)結(jié)果進(jìn)行二次篩選時(shí),必須使用having
連表操作:
#左右連表 join
select * from test1,test2 where test1.id = test2.part_id;
select * from test1left join test2 on test1.id = test2.part_id; test1左邊會(huì)全部顯示
select * from test rightjoin test2 on test1.id = test2.part_id; test1右邊會(huì)全部顯示
select * from testinnderjoin test2 on test1.id = test2.part_id; 會(huì)把出現(xiàn)null的那一行隱藏
#上下連表 union
select id,name from test1
union #自動(dòng)去重
select id,name from test2;
select id,name from test1
union all #不去重
select id,name from test2;
轉(zhuǎn)儲(chǔ)mysql文件:
mysqldump -uroot test1> test1.sql -p#數(shù)據(jù)表結(jié)構(gòu)+數(shù)據(jù)
mysqldump -uroot -d test1> test1.sql -p#只有數(shù)據(jù)表結(jié)構(gòu)
導(dǎo)入mysql文件:
create databases test1;
mysqldump -uroot -d test1 < test1.sql -p;
臨時(shí)表
select id from (select id from test where num>60) as B;
添加條件
select min(num),min(num)+1,case when num<10 then 0 else min(num) end from score
5.視圖:
#創(chuàng)建
create view as view1 select * from test where id>10;
#視圖是一個(gè)臨時(shí)表
#視圖是虛擬出來(lái)的,不是物理表,因此不能插入數(shù)據(jù)
#修改
alter view 視圖名稱 as SQL
#刪除
drop view 視圖名稱;
6.觸發(fā)器:
#插入前
create trigger t1 BEFORE INSERT on student for EACH ROW
BEGIN
INSERT into teacher(tname) values(NEW.sname);
END
#插入后 after insert
#刪除前 before delete
#刪除后 after delete
#更新前 before update
#更新后 after update
#由于默認(rèn);結(jié)束,因此不會(huì)執(zhí)行end,所以要執(zhí)行觸發(fā)器之前要先修改終止符
delimiter //
create trigger t1 BEFORE INSERT on student for EACH ROW
BEGIN
INSERT into teacher(tname) values(sname);
END //
delimiter ;
#創(chuàng)建時(shí)自動(dòng)插入:
drop trigger t1; #結(jié)束上一個(gè)觸發(fā)器
delimiter //
create trigger t1 BEFORE INSERT on student for EACH ROW
BEGIN
INSERT into teacher(tname) values(NEW.sname);
END //
delimiter ;
insert into student(gender,class_if,sname) values('女',1,'abc')
7.函數(shù):
#自定義函數(shù)(有返回值)
#創(chuàng)建函數(shù)
delimiter \
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int; 聲明一個(gè)變量類型是整數(shù)
set num = i1 + i2;
return(num);
END \
delimiter ;
#運(yùn)行函數(shù)
select f1(1,100);
內(nèi)置函數(shù):
時(shí)間重點(diǎn)
8.SQL存儲(chǔ)過(guò)程:
1.簡(jiǎn)單存儲(chǔ)過(guò)程
delimiter //
create PROCEDURE p1()
BEGIN
select * from student;
insert into teacher(tname) values('ct');
END
delimiter ;
#調(diào)用存儲(chǔ)過(guò)程
call p1;
cursor.callproc('p1')
2.傳參數(shù)(in,out,inout)
delimiter //
create PROCEDURE p2(
in n1 int,
in n2 int
)
BEGIN
select * from student where sid>n1;
END
#調(diào)用
call p2(12,2);
cursor.callproc('p2',(12,2))
delimiter //
create PROCEDURE p2(
in n1 int,
out n2 int #out偽裝返回值
)
BEGIN
set n2 = 123123;
select * from student where sid>n1;
END
#調(diào)用
set @vi = 0 #創(chuàng)建了一個(gè)session級(jí)的變量叫做v1,可以在外部接收
call p2(12,@v1)
select @v1; 接收變量
cursor.execute('select @_p2_0,@_p2_1') #pymysql中接收存儲(chǔ)過(guò)程變量
存儲(chǔ)過(guò)程的特性:
a.可傳參 (in out inout)
b.pymysql
為什么有結(jié)果值又有out偽造的返回值:
out的作用:用于標(biāo)識(shí)存儲(chǔ)過(guò)程的執(zhí)行結(jié)果,如1為失敗,2為成功,3為局部成功
9.事務(wù):
delimiter //
create procedure p4(
out status int
)
BEGIN
1.聲明如果出現(xiàn)異常則執(zhí)行{
set status = 1;
rollback;#回滾
}
開(kāi)始事務(wù)
--a賬戶減少100
--b賬戶增加100
commit;
結(jié)束
set status = 2;
#如果這里的事務(wù)執(zhí)行順利,會(huì)得到變量等于2,不會(huì)執(zhí)行回滾
END //
delimiter ;
delimiter \
create PROCESDURE p1(
out p_return_code tinyint
)
BEGIN
declare exit handler for sqlexception #這樣代碼的意思是如果沒(méi)有順利執(zhí)行,就執(zhí)行下面的代碼
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
START TRANSACTION;
DELETE from tb1;
insert into tb2(name) values('seven');
COMMIT;
--SUCCESS
set p_return_code = 0;
END\
delimiter ;
#正確的返回0,錯(cuò)誤的返回1
10.游標(biāo):
delimiter //
create procedure p6()
begin
declare row_id int; --自定義變量1
declare row_num varchar(50); --自定義變量2
declare done INT DEFAULT FALSE;
declare my_cursor CURSOR FOR select id,num from A;
declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
open my_cursor; #打開(kāi)游標(biāo)
xxoo: LOOP #開(kāi)始循環(huán)
fetch my_cursor into row_id,row_num; #取一行數(shù)據(jù)賦值給row_id和row_num
if done then
leave xxoo;
END IF;
insert into teacher(tname) values(ssname);
end loop xxoo; #終止循環(huán)
close my cursor; #關(guān)閉游標(biāo)
end //
delimter;
11.動(dòng)態(tài)執(zhí)行SQL(防SQL注入):
delimiter //
create procefure p7(
in tpl varchar(255),
in arg int
)
begin
1.預(yù)檢測(cè)某個(gè)東西,SQL語(yǔ)句合法化
2.SQL = 格式化 tp+arg
3.執(zhí)行SQL語(yǔ)句
set @x0 = arg; #聲明變量
PREPARE(準(zhǔn)備) XXX(變量) FROM 'select * from student where sid > ?';
EXECUTE(執(zhí)行) xxx USING @arg(替換上面的?);
DEALLOCATE prepare prod;(執(zhí)行已經(jīng)格式化完成的SQL語(yǔ)句)
end //
delimter;
call p7('select * from tb where id > ?',9)
delimiter \
CREATE PROCEDURE p8 (
in nid int
)
BEGIN
set @nid = nid;
PREPARE prod FROM 'select * from student where sid > ?';
EXECUTE prod USING @nid;
DEALLOCATE prepare prod;
END\
delimiter ;
總結(jié)
以上是生活随笔為你收集整理的MySQL自增列的步长问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美股周二:纳指跌近2%,热门中概股普跌,
- 下一篇: 非人学园晓音技能怎么用?非人学园晓音要怎