本文目錄一覽:
mysql設置主鍵的代碼是什麼?
mysql設置主鍵的代碼是PRIMARY KEY (主鍵欄位)。
如:CREATE TABLE Customer (SID integer,Last_Name varchar(30),First_Name varchar(30),PRIMARY KEY (SID))。
主關鍵字(主鍵,primary key)是被挑選出來,作表的行的唯一標識的候選關鍵字。一個表只有一個主關鍵字。主關鍵字又可以稱為主鍵。
擴展資料:
永遠也不要更新主鍵。實際上,因為主鍵除了唯一地標識一行之外,再沒有其他的用途了,所以也就沒有理由去對它更新。如果主鍵需要更新,則說明主鍵應對用戶無意義的原則被違反了。
主鍵應當由計算機自動生成。如果由人來對主鍵的創建進行干預,就會使它帶有除了唯一標識一行以外的意義。一旦越過這個界限,就可能產生人為修改主鍵的動機,這樣,這種系統用來鏈接記錄行、管理記錄行的關鍵手段就會落入不了解資料庫設計的人的手中。
請問誰能詳細介紹mysql的數據類型呢?
MySQL 數據類型細分下來,大概有以下幾類:
數值,典型代表為 tinyint,int,bigint
浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞
字元串,典型代表為 char,varchar
時間日期,典型代表為 date,datetime,time,timestamp
二進位,典型代表為 binary,varbinary
位類型
枚舉類型
集合類型
以下內容,我們在另一篇文章介紹
大對象,比如 text,blob
json 文檔類型
一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據範圍的不同,選擇不同的類型。
以上是幾個整數選型的例子。整數的應用範圍最廣泛,可以用來存儲數字,也可以用來存儲時間戳,還可以用來存儲其他類型轉換為數字後的編碼,如 IPv4 等。示例 1用 int32 來存放 IPv4 地址,比單純用字元串節省空間。表 x1,欄位 ipaddr,利用函數 inet_aton,檢索的話用函數 inet_ntoa。
查看磁碟空間佔用,t3 佔用最大,t1 佔用最小。所以說如果整數存儲範圍有固定上限,並且未來也沒有必要擴容的話,建議選擇最小的類型,當然了對其他類型也適用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 3.0G3541825 861M -rw-r—– 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r—– 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r—– 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd
二、浮點數 / 定點數先說 浮點數,float 和 double 都代表浮點數,區別簡單記就是 float 默認占 4 Byte。float(p) 中的 p 代表整數位最小精度。如果 p 24 則直接轉換為 double,占 8 Byte。p 最大值為 53,但最大值存在計算不精確的問題。再說 定點數,包括 decimal 以及同義詞 numeric,定點數的整數位和小數位分別存儲,有效精度最大不能超過 65。所以區別於 float 的在於精確存儲,必須需要精確存儲或者精確計算的最好定義為 decimal 即可。示例 3創建一張表 y1,分別給欄位 f1,f2,f3 不同的類型。mysql-(ytt/3305)-create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)
三、字元類型字元類型和整形一樣,用途也很廣。用來存儲字元、字元串、MySQL 所有未知的類型。可以簡單說是萬能類型!
char(10) 代表最大支持 10 個字元存儲,varhar(10) 雖然和 char(10) 可存儲的字元數一樣多,不同的是 varchar 類型存儲的是實際大小,char 存儲的理論固定大小。具體的位元組數和字符集相關。示例 4例如下面表 t4 ,兩個欄位 c1,c2,分別為 char 和 varchar。mysql-(ytt/3305)-create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)
所以在 char 和 varchar 選型上,要注意看是否合適的取值範圍。比如固定長度的值,肯定要選擇 char;不確定的值,則選擇 varchar。
四、日期類型日期類型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte。
time,timestamp,datetime 在不包含小數位時分別佔用 3 Byte,4 Byte,8 Byte;小數位部分另外計算磁碟佔用,見下面表格。
請點擊輸入圖片描述
注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值範圍為 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’;datetime 取值範圍為 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
綜上所述,日期這塊類型的選擇遵循以下原則:
1. 如果時間有可能超過時間戳範圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。
4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。
示例 5
建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。
當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)-alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0
五、二進位類型
binary 和 varbinary 對應了 char 和 varchar 的二進位存儲,相關的特性都一樣。不同的有以下幾點:
binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。
行結束符不一樣。char 的行結束符是 \0,binary 的行結束符是 0x00。
由於是二進位存儲,所以字元編碼以及排序規則這類就直接無效了。
示例 6
來看這個 binary 存取的簡單示例,還是之前的變數 @a。
切記!這裡要提前計算好 @a 佔用的位元組數,以防存儲溢出。
六、位類型
bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進位方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:
1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進位來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進位來過濾。
示例 7
創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)-create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)-select cast(gender as unsigned) ‘f1’ from c1;+——+| f1 |+——+| 0 || 1 |+——+2 rows in set (0.00 sec)
過濾數據也一樣,二進位或者直接十進位都行。mysql-(ytt/3305)-select conv(gender,16,10) as gender \ – from c1 where gender = b’1′; +——–+| gender |+——–+| 1 |+——–+1 row in set (0.00 sec) mysql-(ytt/3305)-select conv(gender,16,10) as gender \ – from c1 where gender = ‘1’;+——–+| gender |+——–+| 1 |+——–+1 row in set (0.00 sec)
其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。
mysql-(ytt/3305)-create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)
那現在我給表 c1 簡單的造點測試數據。
mysql-(ytt/3305)-select count(*) from c1;+———-+| count(*) |+———-+| 33554432 |+———-+1 row in set (1.37 sec)
把 c1 的數據全部插入 c2。
mysql-(ytt/3305)-insert into c2 select if(gender = 0,”,null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0
兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r—– 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r—– 1 mysql mysql 916M 12月 11 10:22 c2.ibd
檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。
七、枚舉類型
枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:
1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。
示例 8
創建表 t7。mysql-(ytt/3305)-create table t7(c1 enum(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.03 sec)
八、集合類型
集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:
1. 最大佔用 8 Byte,int64。2. 內部以二進位位的方式存儲,對應的下標如果以十進位來看,就分別為 1,2,4,8,…,pow(2,63)。3. 最大支持 64 個不同的元素,重複元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。
示例 9
定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。
mysql-(ytt/3305)-create table c7(c1 set(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.02 sec)
插入 1 到 128 的所有組合。
mysql-(ytt/3305)-INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0
九、數據類型在存儲函數中的用法
函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。
示例 10
定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。
簡單調用下。
mysql-(ytt/3305)-select ytt_sample_data_type(1111,222) ‘result’;+————————–+| result |+————————–+| The result is: ‘246642’. |+————————–+1 row in set (0.00 sec)
總結
本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。
如何查看mySQL的源代碼
給你個過來人的建議。兩個方式入手。
1、利用他。儘可能從大模塊開始,用你的代碼,去調用他。這是從功能特性角度,去理解各個模塊的作用。這非常容易加深你對應用它的理解。
2、在代碼中插入LOG,檢測代碼運行流程。
如果你只是靜態的看代碼,這個不現實的。
如果你想看一部分代碼。首先你要想辦法讓這套代碼RUN起來,如果你使用任何方式都無法讓這段代碼運行,我只能說,這段代碼沒有存在價值。為什麼在裡面,當然更大的可能是,你沒找到開啟它的方法。
動態分析法,是門學問。包括對運行態才出現BUG的系統進行DEBUG,當然不是GDB或者VC的F5模式。不過貌似學校沒有這類教學。很工程的東西。我也只是經驗所得。沒有系統的理論化。
例如一套系統,你在不改代碼的情況下,要能找到問題。甚至不能加LOG代碼,只能通過反饋判斷。不是不可能的。甚至有時必須這麼做。
mysql基本語句詳細教程
看他們網上的,寫得都是千篇一律,同時,好多也寫得不是很好,下面是我自己總結的有關mysql的使用細節,也是我在學習過程中的一些記錄吧,希望對你有點幫助,後面有關存儲過程等相關操作還沒有總結好,下次總結好了再發給你吧,呵呵~~~~~
MySql學習筆記
MySql概述:MySql是一個種關聯資料庫管理系統,所謂關聯資料庫就是將數據保存在不同的表中,而不是將所有數據放在一個大的倉庫中。這樣就增加了速度與提高了靈活性。並且MySql軟體是一個開放源碼軟體。
注意,MySql所支持的TimeStamp的最大範圍的問題,在32位機器上,支持的取值範圍是年份最好不要超過2030年,然後如果在64位的機器上,年份可以達到2106年,而對於date、與datetime這兩種類型,則沒有關係,都可以表示到9999-12-31,所以這一點得注意下;還有,在安裝MySql的時候,我們一般都選擇Typical(典型安裝)就可以了,當然,如果還有其它用途的話,那最好選擇Complete(完全安裝);在安裝過程中,一般的還會讓你進行伺服器類型的選擇,分別有三種伺服器類型的選擇,(Developer(開發機)、Server Machine(伺服器)、Dedicated MySql Server Machine(專用MYSQL伺服器)),選擇哪種類型的伺服器,只會對配置嚮導對內存等有影響,不然其它方面是沒有什麼影響的;所以,我們如果是開發者,選擇開發機就可以啦;然後接下來,還會有資料庫使用情況對話框的選擇,我們只要按照默認就可以啦;
連接與斷開伺服器:
連接:在windows命令提示符下輸入類似如下命令集:mysql –h host –u user –p
例如,我在用的時候輸入的是:mysql –h localhost –u root –p
然後會提示要你輸入用戶密碼,這個時候,如果你有密碼的話,就輸入密碼敲回車,如果沒有密碼,直接敲回車,就可以進入到資料庫客戶端;連接遠程主機上的mysql,可以用下面的命令:mysql –h 159.0.45.1 –u root –p 123
斷開伺服器:在進入客戶端後,你可以直接輸入quit然後回車就可以了;
下面就資料庫相關命令進行相關說明
你可以輸入以下命令對資料庫表格或者資料庫進行相關操作,在這裡就省略了,然後直接進行文字說明了;
Select version(),current_date;//從伺服器得到當前mysql的版本號與當前日期
Select user(); //得到當前資料庫的所有用戶
Use databasename; 進入到指定的資料庫當中,然後就可以操作這個資料庫當中的表格了
Show databases; //查詢目前資料庫中所有的資料庫,並且顯示出來;
Create batabase databasename;創建資料庫,例如:create database manager;
Show tables; //查看當前資料庫中的所有表格;
Create table tablename(colums);創建表,並且給表指定相關列,例如:create table pet(name varchar(20),owner varchar(20),species varchar(20),sex char(1),birth date,death date);
Describe tablename;將表當中的所有信息詳細顯示出來,例如:describe pet;
可以用命令一次插入多條記錄,例如:
Insert into pet values(『Puffball』,』Diane』,』hamster』,』f』,』1993-12-3』,null),( 『Puffball』,』Diane』,』hamster』,』f』,』1993-12-3』,now());
Select * from pet; 從pet表當中查詢出所有的記錄,顯示出來;
Delete from pet where id=1;刪除ID為1的那一條記錄;
Update pet set birth=』2001-1-3』 where name=』Bowser』;更新name為Bowser的記錄當中的birth欄位的值;
Select distinct owner from pet;從pet表中選擇出owner欄位的值唯一的行,如果有多行記錄這個欄位的值相同,則只顯示最後一次出現這一值的一行記錄;
有關日期計算:
Select name,birth,curdate(),(year(curdate())-year(birth)) as age from pet;
此處,year()函數用於提取對應欄位的年份,當然類似的還有month(),day()等;
在mysql當中,sql語句可以使用like查詢,可以用」_」配任何單個字元,用」%」配任意數目字元,並且SQL模式默認是忽略大小寫,例如:select * from pet where name like 『%fy』;
當然也可以用正則表達式模式進行配。
同時在sql當中,也要注意分組函數、排序函數、統計函數等相關用法,在這裡只列舉一二;
Select species,count(*) from pet group by speceis;
Select * from pet order by birth desc;
查詢最大值的相關操作:
Select max(age) from pet;
取前多少項記錄,這個主要用於分頁查詢操作當中,
Select * from pet order by birth desc limit 3;取前三條記錄,
Select * from pet order by birth desc limit 0,3;這個可以用於分頁查詢,limit後面的第一個參數,是起始位置,第二個參數是取記錄條數;
有關創建表格自增長欄位的寫法:
Create table person(id int(4) not null auto_increment,name char(20) not null,primary key (id));
修改表操作:
向表中增加欄位:注意,在這個地方,如果是增加多個欄位的時候,就要用括弧括起來,不然會有問題,如果是單個欄位的話,不用括弧也沒事;
Alter table test add(address varchar(50) not null default 『xm』,email varchar(20) not null);
將表中某個欄位的名字修改或者修改其對應的相關屬性的時候,要用change對其進行操作;
Alter table test change email email varchar(20) not null default 『zz』;//不修改欄位名
Alter table test change email Email varchar(30) not null;//修改欄位名稱
刪除表中欄位:
Alter table test drop email;//刪除單個欄位
Alter table test drop address,drop email;//刪除多列
可以用Drop來取消主鍵與外鍵等,例如:
Alter table test drop foreign key fk_symbol;
刪除索引:
Drop index index_name on table_name;
例如:drop index t on test;
向表中插入記錄:注意,當插入表中的記錄並不是所有的欄位的時候,應該要在前面列出欄位名稱才行,不然會報錯;
Insert into test(name) values(『ltx』);
Insert into test values(1,』ltx』);
也可以向表中同時插入多列值,如:
Insert into test(name) values(『ltx』),(『hhy』),(『xf』);
刪除表中記錄:
Delete from test;//刪除表中所有記錄;
Delete from test where id=1;//刪除表中特定條件下的記錄;
當要從一個表或者多個表當中查詢出一些欄位然後把這些欄位又要插入到另一個表當中的時候,可以用insert …..select語法;
Insert into testt(name) (select name from test where id=4);
從文件中讀取行插入數據表中,可以用Load data infile語句;
Load data infile 『test.txt』 into table test;
可以用Describe語法進行獲取有關列的信息;
Describe test;//可以查看test表的所有信息,包括對應列欄位的數據類型等;
MySql事務處理相關語法;
開始一項新的事務:start transaction或者begin transaction
提交事務:commit
事務回滾:rollback
set autocommit true|false 語句可以禁用或啟用默認的autocommit模式,只可用於當前連接;
例子:
Start transaction;
Update person set name=』LJB』 where id=1;
Commit | rollback;
資料庫管理語句
修改用戶密碼:以root用戶為例,則可以寫成下面的;mysql –u root –p 舊密碼 –password 新密碼
Mysql –u root –password 123;//將root用戶的密碼修改成123,由於root用戶開始的時候,是沒有密碼的,所以-p舊密碼就省略了;
例如修改一個有密碼的用戶密碼:mysql –u ltx –p 123 –password 456;
增加一個用戶test1,密碼為abc,讓他可以在任何時候主機上登陸,並對所有資料庫有查詢、插入、修改、刪除的許可權。
Grant select,insert,update,delete on *.* to test1@」%」 identified by 『abc』;
增加一個test2用戶,密碼為abc,讓他只可以在localhost上登陸,並且可以對資料庫進行查詢、插入、修改、刪除操作;
Grant select,insert,update,delete on mydb.* to test2@localhost identified by 『abc』;
如果不想讓用戶test2有密碼,可以再輸入以下命令消掉密碼:
Grant select,insert,update,delete on mydb.* to test2@localhost identified by 「」;
備份資料庫常用命令:mysqldump –h host –u username –p dbname保存路徑與文件名
然後回車後,會讓你輸入用戶密碼,輸入密碼後,再回車就OK啦;
Mysqldump –hlocalhost –uroot –p test E:\db\test.sql
這一命令具體解釋下:
這個命令就是備份test資料庫,並且將備份的內容存儲為test.sql文件,並且保存在E:\db下面;
命令當中-p 前面的test是資料庫名,然後在資料庫名後面要跟上一個」」,然後接下來,就是寫要保存的位置與保存文件的文件名;
將備份好的資料庫導入到資料庫當中去:也就是運行.sql文件將資料庫導入資料庫當中去-
首先你得創建資料庫,然後運行如下命令:mysql –hlocalhost –uroot –p linuxE:\db\test.sql然後回車,再輸入密碼就可以啦;
解釋下上面的命令:linux是就要導入的資料庫名字,然後後面要緊跟著「」符號,然後後面就是要導入的資料庫文件;
將資料庫導出保存成XML文件、從XML文件導入數據到資料庫:
導出表中數據:mysql –X –h hostName –u userName –p Pwd –e 「use DatabaseName;sql;」 xml文件名
或者用另外一種方式也行:mysqldump –xml –h hostName –u userName –p pwd dbName tableName //這一種只用於顯示在當前的mysql客戶端,不保存到文件當中;
相關說明:-X代表的是文件的格式是XML,然後-e一寫不能掉,還有就是要用雙引號將要操作的語句括起來;單引號不行;
例如:mysql –X –hlocalhost –uroot –p –e 「use test;select * from pet;」E:\db\out.xml
從XML文件導入數據到資料庫:
Insert into tableName values(1,load_file(『filepath』));
例如:insert into pet values(1,load_file(「E:\db\out.xml」));
查看資料庫狀態與查詢進程:
Show status;//查看狀態
Show processlist;//查看進程
更改用戶名,用以下命令:
Update set user=」新名字」 where user=」舊用戶名」;
給資料庫用戶設置管理員許可權:
Mysqladmin –h host –u username –p pwd;
以root用戶為例;
Mysqladmin –h localhost –u root –p 123;
存儲過程與函數
存儲程序和函數分別是用create procedure和create function語句,一個程序要麼是一個程序要麼是一個函數,使用call語句來調用程序,並且程序只能用輸出變數傳回值;
要想在MySql5.1中創建子程序,必須具有create routine許可權,並且alter routine和execute許可權被自動授予它的創建者;
創建存儲過程:
首先聲明分隔符,所謂分隔符是指你通知mysql客戶端你已經輸入一個sql語句的字元或字元串符號,在這裡我們就以「//」為分隔符;
Delimiter 分隔符\
如:delimiter //
再創建存儲過程:
Create procedure 存儲過程名 ( )
聲明存儲過程開始:
begin
然後開始寫存儲過程體:
Select * from pet;
結束存儲過程:
End;//
剛剛的例子全部寫出來,完整的代碼就是:
Delimiter //
Create procedure spt () //注意,這個地方,存儲過程名與括弧之間要有個空格
Begin
Select * from pet;
End;//到這裡,整個存儲過程就算寫完啦
執行存儲過程:
Call 存儲過程名 ();//
如,我們執行剛剛創建的存儲過程,就是:
Call spt ();//
需要說明的是存儲過程名後面一定要加個空格,而後面那個括弧,則是用於傳送參數的參數列表;另外,我們創建存儲過程完成後,也只是創建了,但是只有調用call 存儲過程名 ();//後才算執行完畢,才能看到存儲過程的結果;
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193711.html