正文之前
昨天終于把我苦命的畢業(yè)設(shè)計(jì)審批表送出去了。結(jié)果暑假的生產(chǎn)實(shí)習(xí)開(kāi)始對(duì)賬,我這兒又開(kāi)始忙活了,還要簽字,我有時(shí)候都在想要不全班代簽一遍算了。不然真的揪心??!mmp,就學(xué)校這些東西破事多?。‰m然合理,但是太忙活了!煩不勝煩,不管了,我還是安心學(xué)我的小習(xí),偶爾寫(xiě)寫(xiě)文章尋尋樂(lè)子吧!今天寫(xiě)了一篇與眾不同的文章(相對(duì)于我以往的文風(fēng),或者說(shuō)我以往就沒(méi)有這玩意?反正勞請(qǐng)看官老爺去看一眼?給個(gè)贊最棒?)

正文
MySQL 序列使用
Mysql教程里面的序列大概就是指能夠自增的列吧,也就是說(shuō)只要你添加了一個(gè)行記錄,那么就算你沒(méi)有給定這個(gè)行的相應(yīng)列的值,它也會(huì)自動(dòng)的給你添加相應(yīng)的自增后的值進(jìn)去。好比一個(gè)人員記錄,沒(méi)插入一個(gè)員工記錄,員工編號(hào)就可以自動(dòng)加1,而不需要你之前再去查看然后指定序號(hào)。想想我們新生入學(xué)的時(shí)候分配學(xué)號(hào),如果還要一個(gè)個(gè)的去添加,增加了多少的工作量,而且如果還不能保證精確性,好比如果U201710655 之后緊接著輸入一個(gè)U201710657 中間那么個(gè)人就沒(méi)了。多尷尬? 所以自增列很有必要,這個(gè)時(shí)候也就是Mysql序列展現(xiàn)效果的時(shí)候了。
你可以在一開(kāi)始的時(shí)候就指定某一列是自增序列,如下:
create table auto_raise(id int unsigned not null auto_increment,primary key(id),···
name varchar(30) not null,date date not null) ···
engine=innodb auto_increment=201410600 charset=utf8;
你看,我指定的就是id這個(gè)主鍵是自增的,所以下面我要對(duì)這個(gè)表格進(jìn)行操作,是不需要對(duì)id這個(gè)列進(jìn)行插入操作的, 系統(tǒng)自己會(huì)給我弄好,多省心?

另外,不知道你看到?jīng)]有,我的id是從201410600開(kāi)始增長(zhǎng)的,怎么做到的呢?你去上看上面創(chuàng)建表格的時(shí)候是怎么做到的吧?聰明如你肯定一下子就看到了!
INSERT INTO auto_raise (id,name,date) VALUES ···
(NULL,'housefly','2001-09-10'),(NULL,'millipede','2001-09-10');

在MySQL的客戶(hù)端中你可以使用 SQL中的LAST_INSERT_ID( ) 函數(shù)來(lái)獲取最后的插入表中的自增列的值。

這個(gè)估計(jì)是用來(lái)手動(dòng)插入的吧?果然,親測(cè)手動(dòng)插入會(huì)自導(dǎo)致自增起點(diǎn)變化,也就是說(shuō)你完全可以在創(chuàng)建了自增之后,先插入一個(gè)想要的起點(diǎn),然后再繼續(xù)進(jìn)行自增達(dá)到指定自增起點(diǎn)的目的,與上面說(shuō)到的創(chuàng)建table的時(shí)候的手段差不多。

看我之后再插入的時(shí)候,就會(huì)從我上次插入的地方開(kāi)始了。

但是,如果我繞道屁股后面去插呢?會(huì)怎么樣?讓我來(lái)試試

果然,我大概知道自增的尿性了。就是逮住了最大的那個(gè)插,如果你指定那就不自增。美滋滋。有自增我指定個(gè)蛋?。?!
如果你刪除了數(shù)據(jù)表中的多條記錄,并希望對(duì)剩下數(shù)據(jù)的AUTO_INCREMENT列進(jìn)行重新排列,那么你可以通過(guò)刪除自增的列,然后重新添加來(lái)實(shí)現(xiàn)。 不過(guò)該操作要非常小心,如果在刪除的同時(shí)又有新記錄添加,有可能會(huì)出現(xiàn)數(shù)據(jù)混亂。操作如下所示:

我們可以看到,如果不刪除原來(lái)的列,那么該表格已經(jīng)記住了上次的自增點(diǎn),所以你想找到原來(lái)的那個(gè)自增起點(diǎn)是找不到了。那么就刪除現(xiàn)在的行列 然后繼續(xù)自增咯~
alter table auto_raise drop id;···
alter table auto_rasie add id INT UNSIGNED NOT NULL ···
AUTO_INCREMENT FIRST,ADD PRIMARY KEY (id);

好像沒(méi)找到很好的辦法,讓所有的id記錄都從201410600開(kāi)始。。之后還是得自己慢慢來(lái)改,麻煩,后面再說(shuō),現(xiàn)在不慌。
alter table auto_raise auto_increment=201410600;

MySQL 處理重復(fù)數(shù)據(jù)
你可以在MySQL數(shù)據(jù)表中設(shè)置指定的字段為 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來(lái)保證數(shù)據(jù)的唯一性。當(dāng)插入重復(fù)數(shù)據(jù)的時(shí)候,會(huì)導(dǎo)致報(bào)錯(cuò),當(dāng)然如果我們可以設(shè)置為ignore,那么插入重復(fù)數(shù)據(jù)也不會(huì)報(bào)錯(cuò),但是會(huì)形成無(wú)效插入,也就是說(shuō)這次插入操作被忽略了。
INSERT IGNORE INTO auto_raise (id,name) VALUES(2017, 'Thomas');

還有一種是設(shè)置為 replace ,顧名思義,ignore是忽視本次插入,replace很明顯是覆蓋原本的重復(fù)的數(shù)據(jù):
replace INTO auto_raise (id,name,date) VALUES(2017, 'Zhang','2018-09-11');

統(tǒng)計(jì)重復(fù)數(shù)據(jù)(下圖根據(jù)name統(tǒng)計(jì)重復(fù)數(shù)據(jù),group by語(yǔ)法)
select count(*) as repeations,name from auto_raise group by name ;

兩種過(guò)濾方式:
mysql> select distinct name from auto_raise ;
mysql> select name from auto_raise group by name;

如果要?jiǎng)h除重復(fù)的元素,那么直接把表通過(guò)group by 進(jìn)行唯一性復(fù)制 ,然后刪除原來(lái)的表,后把臨時(shí)表改個(gè)名字即可!

MySQL 導(dǎo)出數(shù)據(jù)
MySQL中你可以使用SELECT...INTO OUTFILE語(yǔ)句來(lái)簡(jiǎn)單的導(dǎo)出數(shù)據(jù)到文本文件上。
select * from auto_raise into outfile '/Users/zhangzhaobo/Desktop/test.txt';
當(dāng)然,不出意外,你會(huì)有這個(gè)問(wèn)題:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
上網(wǎng)找了不少的辦法,最后還是這個(gè)比較靠譜點(diǎn):

#[/private/etc/my.cnf]
[mysqld]
secure-file-priv="Your Path"
當(dāng)然,你可以先
show variables like '%secure%';
查看一波。一般會(huì)這樣,結(jié)果的第三行那個(gè)NULL就代表了限制導(dǎo)出,所以你需要改變系統(tǒng)配置。
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | NULL |
+--------------------------+-------+
照著上面的辦法,直接懟就好了。如果你的/private/etc/下已經(jīng)有了 my.cnf這個(gè)文件,那么直接找到這個(gè)參數(shù),改一下就好, 沒(méi)有的話(huà),自己創(chuàng)建一個(gè)咯,內(nèi)容如下:

我甚至好心的,可以讓你直接復(fù)制:
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
secure-file-priv='/Users/zhangzhaobo/Desktop/'
記得把路徑改了啊。不然你沒(méi)我這個(gè)用戶(hù)名,路徑報(bào)錯(cuò)的。
弄好之后重啟mysql服務(wù)器就OK了

執(zhí)行完畢之后就這樣咯~

SELECT ... INTO OUTFILE 語(yǔ)句有以下屬性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。為了將一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)寫(xiě)入一個(gè)文件,使用SELECT ... INTO OUTFILE,為了將文件讀回?cái)?shù)據(jù)庫(kù),使用LOAD DATA INFILE。
SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫(xiě)入一個(gè)文件中。該文件被創(chuàng)建到服務(wù)器主機(jī)上,因此您必須擁有FILE權(quán)限,才能使用此語(yǔ)法。
輸出不能是一個(gè)已存在的文件。防止文件數(shù)據(jù)被篡改。
你需要有一個(gè)登陸服務(wù)器的賬號(hào)來(lái)檢索文件。否則 SELECT ... INTO OUTFILE 不會(huì)起任何作用。
在UNIX中,該文件被創(chuàng)建后是可讀的,權(quán)限由MySQL服務(wù)器所擁有。這意味著,雖然你就可以讀取該文件,但可能無(wú)法將其刪除。
導(dǎo)出SQL格式的數(shù)據(jù),這個(gè)數(shù)據(jù)你可以直接用于復(fù)制后完全產(chǎn)生當(dāng)下的表格:


其中的命令也是很好使用的,我甚至懷疑,把擴(kuò)展名改成sql 就可以直接在另一個(gè)服務(wù)器上重新生成一個(gè)新的數(shù)據(jù)庫(kù)表。
還有更狠的!
$ mysqldump -u root -p RUNOOB > database_dump.txt
password ******
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

將數(shù)據(jù)表及數(shù)據(jù)庫(kù)拷貝至其他主機(jī),不然你以為導(dǎo)出的數(shù)據(jù)是直接給你看的啊,當(dāng)然是用于數(shù)據(jù)庫(kù)之間的交流啦??!
$ mysql -u root -p database_name < dump.txt
password *****
你也可以使用以下命令將導(dǎo)出的數(shù)據(jù)直接導(dǎo)入到遠(yuǎn)程的服務(wù)器上,但請(qǐng)確保兩臺(tái)服務(wù)器是相通的,是可以相互訪(fǎng)問(wèn)的:
$ mysqldump -u root -p database_name \ | mysql -h other-host.com database_name
MySQL 導(dǎo)入數(shù)據(jù)
使用 LOAD DATA 導(dǎo)入數(shù)據(jù)(報(bào)錯(cuò)透心涼):
mysql> load data local infile '/Users/zhangzhaobo/Desktop/test1.txt' into table tableclone;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
使用 mysqlimport 導(dǎo)入數(shù)據(jù):
HustWolf:~ zhangzhaobo$ mysqlimport -u root -p --local test '/Users/zhangzhaobo/Desktop/test1.txt'
Enter password:
記得你的數(shù)據(jù)庫(kù)里面要有個(gè)跟你的txt文件同名的表,不然會(huì)報(bào)錯(cuò)。



運(yùn)用如圖:

正文之后
無(wú)言,終于懟玩了Mysql 可以去玩別的了。這些知識(shí)目前還沒(méi)用得上,后面等開(kāi)始做畢設(shè)了,估計(jì)我就是被Mysql玩死的名。先快活吧!!