Oracle
不直接支持 自動遞增的列。
需要創建一個序列 SEQUENCE。
又由於無法在列的默認值那裡,設置默認值為序列。因此只能通過觸發器來設置。
設置好觸發器以後,所有的插入語句,將忽略外部傳入的 id 數據,只使用指定的序列號來產生。
SQL> CREATE SEQUENCE test_sequence2
2 increment by 1 -- 每次遞增1
3 start with 1 -- 從1開始
4 nomaxvalue -- 沒有最大值
5 minvalue 1 -- 最小值=1
6 NOCYCLE; -- 不循環
Sequence created.
SQL> CREATE OR REPLACE TRIGGER BeforeTestCreate2Insert
2 BEFORE INSERT ON test_create_tab2
3 FOR EACH ROW
4 BEGIN
5 SELECT test_sequence2.nextval INTO :new.id FROM al;
6 END;
7 /
Trigger created.
SQL> INSERT INTO test_create_tab2(val) VALUES ('NO id');
1 row created.
SQL Server
通過 IDENTITY 來設置
參數有2個,一個是「初始值」 一個是「增量」。
默認情況下 INSERT 語句中,不能對 IDENTITY 的欄位進行賦值。
1> CREATE TABLE test_create_tab2 (
2> id INT IDENTITY(1, 1) PRIMARY KEY,
3> val VARCHAR(10)
4> );
5> go
1> INSERT INTO test_create_tab2(val) VALUES ('NO id');
2> go
(1 行受影響)
MySQL
通過
AUTO_INCREMENT設置
SQL INSERT語句的時候,要避免 指定那個自增的欄位
否則會發生主鍵的沖突。
mysql> CREATE TABLE test_create_tab2 (
-> id INT AUTO_INCREMENT,
-> val VARCHAR(10),
-> PRIMARY KEY (id)
-> );
-> //
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO test_create_tab2(val) VALUES ('NO id');
-> //
Query OK, 1 row affected (0.03 sec)
㈡ 請教資料庫英文字母都代表什麼
DM 干物質 CP 粗蛋白 ME#P 禽代謝能 DE#S 豬消化能 EE 醚浸出物即粗脂肪 LA CF 粗纖維 ASH 灰分 CA 鈣 TP 總磷 AP#P 禽可利用磷 AP#S 豬可利用磷 LYS 賴氨酸 MET 蛋氨酸 M+C 蛋+胱 THR 蘇氨酸 TRP 色氨酸 A***#P 禽可利用*** A***#S 豬可利用***
㈢ 資料庫中各英文數據類型翻譯,數字類型對應的英文是什麼啊
integer
number
㈣ 資料庫一般用什麼英文代表庫存單號
Database inventory number
資料庫庫存單號,完整版
㈤ 資料庫設計中為什麼進行分類編碼設計分類的方法是什麼
分類演算法要解決的問題
在網站建設中,分類演算法的應用非常的普遍。在設計一個電子商店時,要涉及到商品分類;在設計發布系統時,要涉及到欄目或者頻道分類;在設計軟體下載這樣的程序時,要涉及到軟體的分類;如此等等。可以說,分類是一個很普遍的問題。
我常常面試一些程序員,而且我幾乎毫無例外地要問他們一些關於分類演算法的問題。下面的舉幾個我常常詢問的問題。你認為你可以很輕松地回答么?
1、分類演算法常常表現為樹的表示和遍歷問題。那麼,請問:如果用資料庫中的一個Table來表達樹型分類,應該有幾個欄位?
2、如何快速地從這個Table恢復出一棵樹?
3、如何判斷某個分類是否是另一個分類的子類?
4、如何查找某個分類的所有產品?
5、如何生成分類所在的路徑。
6、如何新增分類?
在不限制分類的級數和每級分類的個數時,這些問題並不是可以輕松回答的。本文試圖解決這些問題。
分類的數據結構
我們知道:分類的數據結構實際上是一棵樹。在《數據結構》課程中,大家可能學過Tree的演算法。由於在網站建設中我們大量使用資料庫,所以我們將從Tree在資料庫中的存儲談起。
為簡化問題,我們假設每個節點只需要保留Name這一個信息。我們需要為每個節點編號。編號的方法有很多種。在資料庫中常用的就是自動編號。這在Access、SQL Server、Oracle中都是這樣。假設編號欄位為ID。
為了表示某個節點ID1是另外一個節點ID2的父節點,我們需要在資料庫中再保留一個欄位,說明這個分類是屬於哪個節點的兒子。把這個欄位取名為FatherID。如這里的ID2,其FatherID就是ID1。
這樣,我們就得到了分類Catalog的數據表定義:
Create Table [Catalog](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[FatherID] [int] NOT NULL
);
約定:我們約定用-1作為最上面一層分類的父親編碼。編號為-1的分類。這是一個虛擬的分類。它在資料庫中沒有記錄。
如何恢復出一棵樹
上面的Catalog定義的最大優勢,就在於用它可以輕松地恢復出一棵樹?分類樹。為了更清楚地展示演算法,我們先考慮一個簡單的問題:怎樣顯示某個分類的下一級分類。我們知道,要查詢某個分類FID的下一級分類,SQL語句非常簡單:
select Name from catalog where FatherID=FID
顯示這些類別時,我們可以這樣:
<%
REM oConn---資料庫連接,調用GetChildren時已經打開
REM FID-----當前分類的編號
Function GetChildren(oConn,FID)
strSQL = "select ID,Name from catalog where FatherID="&FID
set rsCatalog = oConn.Execute(strSQL)
%>
<UL>
<%
Do while not rsCatalog.Eof
%>
<LI><%=rsCatalog("Name")%>
<%
Loop
%>
</UL>
<%
rsCatalog.Close
End Function
%>
現在我們來看看如何顯示FID下的所有分類。這需要用到遞歸演算法。我們只需要在GetChildren函數中簡單地對所有ID進行調用:GetChildren(oConn,Catalog(「ID」))就可以了。
<%
REM oConn---資料庫連接,已經打開
REM FID-----當前分類的編號
Function GetChildren(oConn,FID)
strSQL = "select Name from catalog where FatherID="&FID
set rsCatalog = oConn.Execute(strSQL)
%>
<UL>
<%
Do while not rsCatalog.Eof
%>
<LI><%=rsCatalog("Name")%>
<%=GetChildren(oConn,Catalog("ID"))%>
<%
Loop
%>
</UL>
<%
rsCatalog.Close
End Function
%>
修改後的GetChildren就可以完成顯示FID分類的所有子分類的任務。要顯示所有的分類,只需要如此調用就可以了:
<%
REM strConn--連接資料庫的字元串,請根據情況修改
set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open strConn
=GetChildren(oConn,-1)
oConn.Close
%>
如何查找某個分類的所有產品
現在來解決我們在前面提出的第四個問題。第三個問題留作習題。我們假設產品的數據表如下定義:
Create Table Proct(
[ID] [int] NOT NULL,
[Name] [nvchar] NOT NULL,
[FatherID] [int] NOT NULL
);
其中,ID是產品的編號,Name是產品的名稱,而FatherID是產品所屬的分類。對第四個問題,很容易想到的辦法是:先找到這個分類FID的所有子類,然後查詢所有子類下的所有產品。實現這個演算法實際上很復雜。代碼大致如下:
<%
Function GetAllID(oConn,FID)
Dim strTemp
If FID=-1 then
strTemp = ""
else
strTemp =","
end if
strSQL = "select Name from catalog where FatherID="&FID
set rsCatalog = oConn.Execute(strSQL)
Do while not rsCatalog.Eof
strTemp=strTemp&rsCatalog("ID")&
GetAllID(oConn,Catalog("ID")) REM 遞歸調用
Loop
rsCatalog.Close
GetAllID = strTemp
End Function
REM strConn--連接資料庫的字元串,請根據情況修改
set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open strConn
FID = Request.QueryString("FID")
strSQL = "select top 100 * from Proct
where FatherID in ("&GetAllID(oConn,FID)&")"
set rsProct=oConn.Execute(strSQL)
%>
<UL><%
Do while not rsProct.EOF
%>
<LI><%=rsProct("Name")%>
<%
Loop
%>
</UL>
<%rsProct.Close
oConn.Close
%>
這個演算法有很多缺點。試列舉幾個如下:
1、 由於我們需要查詢FID下的所有分類,當分類非常多時,演算法將非常地不經濟,而且,由於要構造一個很大的strSQL,試想如果有1000個分類,這個strSQL將很大,能否執行就是一個問題。
2、 我們知道,在SQL中使用In子句的效率是非常低的。這個演算法不可避免地要使用In子句,效率很低。
我發現80%以上的程序員鍾愛這樣的演算法,並在很多系統中大量地使用。細心的程序員會發現他們寫出了很慢的程序,但苦於找不到原因。他們反復地檢查SQL的執行效率,提高機器的檔次,但效率的增加很少。
最根本的問題就出在這個演算法本身。演算法定了,能夠再優化的機會就不多了。我們下面來介紹一種演算法,效率將是上面演算法的10倍以上。
分類編碼演算法
問題就出在前面我們採用了順序編碼,這是一種最簡單的編碼方法。大家知道,簡單並不意味著效率。實際上,編碼科學是程序員必修的課程。下面,我們通過設計一種編碼演算法,使分類的編號ID中同時包含了其父類的信息。一個五級分類的例子如下:
此例中,用32(4+7+7+7+7)位整數來編碼,其中,第一級分類有4位,可以表達16種分類。第二級到第五級分類分別有7位,可以表達128個子分類。
顯然,如果我們得到一個編碼為 1092787200 的分類,我們就知道:由於其編碼為
0100 0001001 0001010 0111000 0000000
所以它是第四級分類。其父類的二進制編碼是0100 0001001 0001010 0000000 0000000,十進制編號為1092780032。依次我們還可以知道,其父類的父類編碼是0100 0001001 0000000 0000000 0000000,其父類的父類的父類編碼是0100 0000000 0000000 0000000 0000000。
現在我們在一般的情況下來討論類別編碼問題。設類別的層次為k,第i層的編碼位數為Ni, 那麼總的編碼位數為N(N1+N2+..+Nk)。我們就得到任何一個類別的編碼形式如下:
2^(N-(N1+N2+…+Ni))*j + 父類編碼
其中,i表示第i層,j表示當前層的第j個分類。這樣我們就把任何分類的編碼分成了兩個部分,其中一部分是它的層編碼,一部分是它的父類編碼。由下面公式定一的k個編碼我們稱為特徵碼:(因為i可以取k個值,所以有k個)
2^N-2^(N-(N1+N2+…+Ni))
對於任何給定的類別ID,如果我們把ID和k個特徵碼「相與」,得到的非0編碼,就是其所有父類的編碼!
位編碼演算法
對任何順序編碼的Catalog表,我們可以設計一個位編碼演算法,將所有的類別編碼規格化為位編碼。在具體實現時,我們先創建一個臨時表:
Create TempCatalog(
[OldID] [int] NOT NULL,
[NewID] [int] NOT NULL,
[OldFatherID] [int] NOT NULL,
[NewFatherID] [int] NOT NULL
);
在這個表中,我們保留所有原來的類別編號OldID和其父類編號OldFatherID,以及重新計算的滿足位編碼要求的相應編號NewID、NewFatherID。
程序如下:
<%
REM oConn---資料庫連接,已經打開
REM OldFather---原來的父類編號
REM NewFather---新的父類編號
REM N---編碼總位數
REM Ni--每一級的編碼位數數組
REM Level--當前的級數
sub FormatAllID(oConn,OldFather,NewFather,N,Nm,Ni byref,Level)
strSQL = "select CatalogID ,
FatherID from Catalog where FatherID=" & OldFather
set rsCatalog=oConn.Execute( strSQL )
j = 1
do while not rsCatalog.EOF
i = 2 ^(N - Nm) * j
if Level then i= i + NewFather
OldCatalog = rsCatalog("CatalogID")
NewCatalog = i
REM 寫入臨時表:
strSQL = "Insert into TempCatalog (OldCatalogID ,
NewCatalogID , OldFatherID , NewFatherID)"
strSQL = strSQL & " values(" & OldCatalog & " ,
" & NewCatalog & " , " & OldFather & " , " & NewFather & ")"
Conn.Execute strSQL
REM 遞歸調用FormatAllID:
Nm = Nm + Ni(Level+1)
FormatAllID oConn,OldCatalog , NewCatalog ,N,Nm,Ni,Level + 1
rsCatalog.MoveNext
j = j+1
loop
rsCatalog.Close
end sub
%>
調用這個演算法的一個例子如下:
<%
REM 定義編碼參數,其中N為總位數,Ni為每一級的位數。
Dim N,Ni(5)
Ni(1) = 4
N = Ni(1)
for i=2 to 5
Ni(i) = 7
N = N + Ni(i)
next
REM 打開資料庫,創建臨時表:
strSQL = "Create TempCatalog( [OldID]
[int] NOT NULL, [NewID] [int] NOT NULL,
[OldFatherID] [int] NOT NULL, [NewFatherID] [int] NOT NULL);"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open Application("strConn")
Conn.Execute strSQL
REM 調用規格化常式:
FormatAllID Conn,-1,-1,N,Ni(1),Ni,0
REM ---------------------------------------------
REM 在此處更新所有相關表的類別編碼為新的編碼即可。
REM ----------------------------------------------
REM 關閉資料庫:
strSQL= "drop table TempCatalog;"
Conn.Execute strSQL
Conn.Close
%>
第四個問題
現在我們回頭看看第四個問題:怎樣得到某個分類下的所有產品。由於採用了位編碼,現在問題變得很簡單。我們很容易推算:某個產品屬於某個類別的條件是Proct.FatherID&(Catalog.ID的特徵碼)=Catalog.ID。其中「&」代表位與演算法。這在SQL Server中是直接支持的。
舉例來說:產品所屬的類別為:1092787200,而當前類別為1092780032。當前類別對應的特徵值為:4294950912,由於1092787200&4294950912=8537400,所以這個產品屬於分類8537400。
我們前面已經給出了計算特徵碼的公式。特徵碼並不多,而且很容易計算,可以考慮在Global.asa中Application_OnStart時間觸發時計算出來,存放在Application(「Mark」)數組中。
當然,有了特徵碼,我們還可以得到更加有效率的演算法。我們知道,雖然我們採用了位編碼,實際上還是一種順序編碼的方法。表現出第I級的分類編碼肯定比第I+1級分類的編碼要小。根據這個特點,我們還可以由FID得到兩個特徵碼,其中一個是本級位特徵碼FID0,一個是上級位特徵碼FID1。而產品屬於某個分類FID的充分必要條件是:
Proct.FatherID>FID0 and Proct.FatherID<FID1
下面的程序顯示分類FID下的所有產品。由於數據表Proct已經對FatherID進行索引,故查詢速度極快:
<%
REM oConn---資料庫連接,已經打開
REM FID---當前分類
REM FIDMark---特徵值數組,典型的情況下為Application(「Mark」)
REM k---數組元素個數,也是分類的級數
Sub GetAllProct(oConn,FID,FIDMark byref,k)
' 根據FID計算出特徵值FID0,FID1
for i=k to 1
if (FID and FIDMark = FID ) then exit
next
strSQL = "select Name from Proct where FatherID>
"FIDMark(i)&" and FatherID<"FIDMark(i-1)
set rsProct=oConn.Execute(strSQL)%>
<UL><%
Do While Not rsProct.Eof%>
<LI><%=rsProct("Name")
Loop%>
</UL><%
rsProct.Close
End Sub
%>
關於第5個問題、第6個問題,就留作習題吧。有了上面的位編碼,一切都應該迎刃而解。
㈥ 請問資料庫里的類型的這幾個英語是什麼意思
bigint 長整型數
binary 二進制
bit 位,比特
char 字元
datetime 日期時間
decimal 十進制
float 浮動
image 圖像
int 取整
money 貨幣
nchar
ntext
numeric 數字,數據
nvarchar 類型
real 復數的實部
smalldatetime
smallint
smallmoney
sql_variant變數結構化查詢語言
text 文本
timestamp 時間信息
tinyint 微整型
uniqueidentifier唯一標識符
varbinary 可變二進制
varchar 可變長字元串
有一些不太清楚,可能不夠術語,希望有幫助吧
㈦ 請問資料庫有哪些種類呢
資料庫共有3種類型,為關系資料庫、非關系型資料庫和鍵值資料庫。
1、關系資料庫
MySQL、MariaDB(MySQL的代替品,英文維基網路從MySQL轉向MariaDB)、Percona Server(MySQL的代替品·)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables、FileMaker、Oracle資料庫、Sybase、dBASE、Clipper、FoxPro、foshub。
幾乎所有的資料庫管理系統都配備了一個開放式資料庫連接(ODBC)驅動程序,令各個資料庫之間得以互相集成。
2、非關系型資料庫(NoSQL)
BigTable(Google)、Cassandra、MongoDB、CouchDB。
3、鍵值(key-value)資料庫
Apache Cassandra(為Facebook所使用):高度可擴展、Dynamo、LevelDB(Google)。
(7)資料庫的類別編號是哪個英文擴展閱讀:
資料庫模型:對象模型、層次模型(輕量級數據訪問協議)、網狀模型(大型數據儲存)、關系模型、面向對象模型、半結構化模型、平面模型(表格模型,一般在形式上是一個二維數組。如表格模型數據Excel)。
資料庫的架構可以大致區分為三個概括層次:內層、概念層和外層。
㈧ 資料庫中的"行"是什麼英文簡寫是什麼
行代表一條記錄,如Excel中的"行"是一樣的.
英文一般使用Row表示, 比如每行的ID號使用RowID或者每行的序號RowNum
㈨ 資料庫的英文縮寫
DB(Database)資料庫,另外,還有常見的DBMS表示資料庫管理系統(Database Management System)。
資料庫是以某種規則儲存在一起、能夠與多個用戶共享、具有盡可能小的冗餘度、且與應用程序彼此獨立的數據集合,可以視為電子化的文件櫃,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。
(9)資料庫的類別編號是哪個英文擴展閱讀:
資料庫類型:
1、關系資料庫
關系型資料庫,存儲的格式可以直觀地反映實體間的關系。關系型資料庫和常見的表格比較相似,關系型資料庫中表與表之間是有很多復雜的關聯關系的。
常見的關系型資料庫有Mysql,SqlServer等。在輕量或者小型的應用中,使用不同的關系型資料庫對系統的性能影響不大,但是在構建大型應用時,則需要根據應用的業務需求和性能需求,選擇合適的關系型資料庫。
2、非關系型資料庫(NoSQL)
指的是分布式的、非關系型的、不保證遵循ACID原則的數據存儲系統。NoSQL資料庫技術與CAP理論、一致性哈希演算法有密切關系。
NoSQL資料庫技術還是具有非常明顯的應用優勢,如資料庫結構相對簡單,在大數據量下的讀寫性能好;能滿足隨時存儲自定義數據格式需求,非常適用於大數據處理工作。
㈩ 資料庫有哪些類型
資料庫有兩種類型,分別是關系型資料庫與非關系型資料庫。
資料庫,簡而言之可視為電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
關系型資料庫主要有:
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等等。
非關系型資料庫主要有:
NoSql、Cloudant、MongoDb、redis、HBase等等。
(10)資料庫的類別編號是哪個英文擴展閱讀:
非關系型資料庫的優勢:
1、性能高:NOSQL是基於鍵值對的,可以想像成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,所以性能非常高。
2、可擴展性好:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
關系型資料庫的優勢:
1、可以復雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常復雜的數據查詢。
2、事務支持良好:使得對於安全性能很高的數據訪問要求得以實現。