SQL這一塊沒什么難度,主要是一個熟練度,稍微上點難度的地方,其實在于查,比較復雜,涉及到很多問題。
指定列插入
??????? 使用指定列插入的時候,未被指定的列使用默認值進行存儲,默認值為空。
默認值設置
??????? default關鍵字,在設置字段時,可以對其默認值進行修改
Primary Key 主鍵
??????? 主鍵約束,主鍵就是一條數據-身份標識
??????? 通過這個約束,來指定某個列作為主鍵
??????? 1)非空
??????? 2)不能重復
???????? 一個表,只能有一個主鍵,但是一個主鍵可以對應多個列,我們稱之為聯合主鍵。
Primary Key auto_increment 自增主鍵
??????? 主鍵,往往是一個整數類型的id,要求不能重復。允許客戶端,在插入數據時候,不手動指定主鍵的值,而是交給MYSQL自行分配,確保分配出來的這個主鍵的值,是和之前不重復的。
??????? primary key auto_increment 自增主鍵 意味著數據庫自行分配一個鍵值.
??????? 那如果再次插入數據的時候,id自動分配的是4還是11?
??????? 數據庫記錄了,當前表中id最大值,此時id自動分配的是11.
??????? 前面的4 5 6 7... 浪費了也無所謂,空間非常大,即便我們浪費幾千、幾萬個也無所謂
??????? 一共可以表示幾十億個數據。
??????? mysql服務器會維護這樣的最大值
??????? 如果mysql是一個單個節點的系統,按照上述自增主鍵的策略,是沒問題的
??????? 如果mysql是一個分布式系統,搞了好幾個主機,每個主機都有mysql,讓他們相互配合,此時,自增主鍵,就無法保證唯一性了。
??????? 注意:每個主機存儲時都只會存儲最大數值的id,那么此時就會出現重復
FOREIGN KEY: 外鍵約束
????????當前這個表的哪一類要受到約束
??????? 在這個代碼中,需要明確交代,哪個表的那一列要受到哪一個表的那一列的約束
create table student(
studentId int primary key auto_increment,
name varchar(20),
classId int,
foreign key (classId) references class(classId));
插入或者修改子表受約束的這一列數據,就需要保證插入/修改后的結果,得在父表中存在!!
刪除/修改 父表中的記錄,就需要看看這個記錄是否在子表中被使用了,如果被使用了,則不能進行修改或者刪除。約束是雙向的
索引
設置外鍵的時候,就會導致在操作子表的時候,頻繁訪問父表
這一個查詢操作,是很耗時間的,為了加快查詢速度,如果父表的ID這一列帶有索引的話,就很好了
索引:相當于頁碼,我們提前知道這個id在書上第幾頁,直接翻到即可,primary key和unique都帶有索引,自動創建索引,因此沒有索引無法創建外鍵
????????