當前位置:首頁 » 操作系統 » db2資料庫主鍵

db2資料庫主鍵

發布時間: 2022-05-11 03:34:12

Ⅰ DB2資料庫表的主鍵怎麼更新

alter table tablename alter primary key (column1,column2,...)
如果不行,先把主鍵drop掉,再加
alter table tablename drop primary key
alter table tablename add primary key (column1,column2,...)
網路應該也可以搜到的~

Ⅱ db2主鍵可以多個嗎

任何資料庫主鍵都只能有一個,其他可以作為主鍵但沒有選為主鍵的叫做候選鍵。比如學生表可以用學號或身份證號唯一標識,如果選學號作為主鍵,那麼身份證號就是候選鍵...

Ⅲ DB2資料庫索引問題-怎樣更快更效率

1.只對唯一性較強並且使用較頻繁的欄位建立單個索引,比如分別對key、a 建立索引。目前上海移動經分倉庫就是按這個大的原則建立的。
因為聯合索引的話對條件查詢的順序打亂就無效了,單獨建立索引用來適應大多數開發情況,且能較少數據冗餘。

2.針對某些特別慢的sql條件建立索引,這種情況是考慮某些SQL的及時性考慮,及時性高的,SQL的結果集重要的,單獨優化。

Ⅳ db2db 資料庫轉換設置自增的必須為主鍵 但是不是怎麼辦

以sqlserver2008R2資料庫為例。可以用如下方法:
1、先建表:

1
2
3

create table test
(id int not null,
name varchar(10))

2、在圖形界面,找到test表:

3、右鍵此表名,選擇「設計」。

4、右側出現的頁面,找到要設置主鍵的列,ID列,然後右鍵,選擇「設置主鍵」。

5、下面一步是要設置自增,在左側列表中,右鍵「id列」,然後選擇「屬性」。

6、其中,找到「標識規范」,標識增量為每次增加多少,標識種子代表起始數值大小。

Ⅳ 資料庫是DB2,多個索引都有某一個欄位,那麼DB2會執行那一個呢

你的兩個索引都是復合索引。所以欄位的順序是很重要的,索引的第一個欄位是主索引碼。索引B+樹是根據主索引碼構造的。index1(oid,name)和index1(name,oid)有天壤之別。
看樣子,oid是主碼吧,它具有唯一性,所以,根據oid、name、age查詢數據時,會優先使用index1(姑且認為index1是(oid,name)形式),在index1中使用oid進行索引頁的查找,因為oid值是唯一的,直接就能快速定位,根本用不到name和age。如果oid不是主碼,如果仍然使用index1,那麼當oid不足以區分表中行的時候,才會使用name和age進一步篩選。
當然,上面的內容也不是絕對的,一方面,DB2會對整個資料庫收集統計信息,根據表中數據的分布和頻率,有可能會選擇index2,甚至不使用索引,直接表掃描;另一方面,如果你的查詢語句中where後面的條件(謂詞)是不可索引謂詞(比如oid<>10),對應的索引同樣不可用。

針對你的資料庫系統到底會使用那個,你可以直接使用explain工具對查詢優化過程進行查看。最簡單的是事業visual explain,圖形化的,會直觀顯示優化過程和結果。
你的問題屬於查詢優化的內容,實際上挺復雜的,建議你找些專業的介紹看看。(看你描述似乎不大專業)

Ⅵ DB2資料庫在已存在的表上新增自增長主鍵

create
table
tabname(col1
type1
[not
null]
[primary
key],col2
type2
[not null],..)

Ⅶ db2建表語句主鍵最長是多少位

資料庫管理器中表的行長度不能超過:
* 在具有 4K 頁大小的表空間中,是 4005 位元組
* 在具有 8K 頁大小的表空間中,是 8101 位元組。
* 在具有 16K 頁大小的表空間中,是 16293 位元組。
* 在具有 32K 頁大小的表空間中,是 32677 位元組。

這個是DB2的硬限制,USERSPACE1是默認創建的4K頁大小的表空間。數據頁大小在表空間創建時指定,不可更改。所以你需要做的是建一個更大數據頁大小的表空間,然後把表建到這個表空間, 命令如下:
1. create tablespace ts32k pagesize 32k managed by database using (FILE 'D:\ts32k\cont1' 2000)
2. create table ..... in ts32k
解決中文存儲進資料庫超過欄位最大容量的問題

Ⅷ DB2中怎麼設置主鍵

創建表時指定primary key,如:
create table mytab(id int not null primary key,
name char(10)
)
注意,not null 不可省略,必須與primary key 同時指定!

Ⅸ 如何用代理鍵實現 DB2 UDB 主鍵

代理鍵是生成惟一序列號的一種有效方法。從本文中可以了解三種實現:傳統方法,使用鍵管理器,以及使用新的 DB2 UDB 特性。簡介使用代理鍵解決方案是為了發現一種生成惟一序列號的有效方法。本文描述了三種實現: 使用傳統方法。 使用鍵管理器。 使用DB2 UDB 特性。 代理鍵也叫 內鍵(internal key)。當創建一個表時,可以添加一個額外的列作為代理鍵。這個列應該是 NOT NULL,並且沒有商業意義。可以將該代理列指定為主鍵列。例如可以有一個數字代理列。代理鍵的值從某一個數字開始,例如 "1",以這個數字作為該列在表中第一行的值,之後的每一行中該列的值都按 1 遞增。 例如,如果我們有表 EMPLOYEE:CREATE TABLE EMPLOYEE ( FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2)) 那麼可以添加一個代理鍵列 SERIALNUMBER,並將其指定為主鍵列。這樣,這個表的定義就變為:CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那麼,怎樣將惟一的值賦給每一行的 SERIALNUMBER 列呢?首先需要為代理鍵生成惟一的值。下面我將討論三種可行的解決方案。回頁首使用傳統方法解決方案的思想傳統方法是使用簡單的 SQL 或觸發器生成惟一的值。示例以表EMPLOYEE 為例。您可以在 INSERT 語句中實現代理鍵生成函數:INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES ((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1, 『John』, 『Smith』, 999.99) SQL 語句 " (SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1 " 將找出最大的 SERIALNUMBER 並將其加 1,這樣新行就有一個惟一的 SERIALNUMBER。 這樣做存在的一個問題是,當將第一行插入表中時,可能會得到如下錯誤: SQL0407N Assignment of a NULL value to a NOT NULL. SQLSTATE=23502. 得到上述錯誤的原因是,當表為空時," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 的返回為 NULL。因此,我們必須使用 COALESCE() 來處理這個問題: INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES (COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1, 『John』, 『Smith』, 999.99) 另一種傳統方法是使用觸發器來生成代理鍵: CREATE TRIGGER AUTOSURROGATEKEY NO CASCADE BEFORE INSERT ON EMPLOYEE REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SET N.SERIALNUMBER = COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1; END 優點及問題傳統方法易於理解,而且容易在所有系統上實現。但是,這種實現實際上會導致事務處理系統中出現並發問題。因為該實現只允許一次執行一條 INSERT 操作。 因此,在獲得最大的 SERIALNUMBER 之前," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 必須等待其他所有事務完成對表 EMPLOYEE 的 INSERT 或 UPDATE 操作。例如,如果有兩個事務正在對 EMPLOYEE 表進行 INSERT 操作,那麼其中有一個事務會被另一個事務阻塞。顯然,這種「逐次插入」的解決方案不適合多用戶的事務處理系統。 回頁首使用鍵管理器解決方案的思想很多大型的應用程序使用鍵管理器方法維護所有表的代理鍵。鍵管理器可以是一個助手類。每當需要向表插入一個行時,便可以調用鍵管理器生成新的鍵值,然後將獲得的鍵值插入新行。示例首先,需要創建表 KEYS 來記錄每個表的當前代理鍵值。鍵管理器類將使用該表生成新鍵值。CREATE TABLE KEYS ( TABLENAME CHAR(256), COLNUMNAME CHAR(256), SURROGATEKEYVALUE BIGINT, INCREMENT BIGINT, PRIMARY KEY(TABLENAME, COLNUMNAME)); 第二,將新表(例如表 EMPLOYEE)注冊到表 KEYS 中。INSERT INTO KEYS (TABLENAME, COLUMNNAME, SURROGATEKEYVALUE, INCREMENT) VALUES (『EMPLOYEE』, 『SERIALNUMBER』, 0, 1); 第三,編寫 KeyManger 類來維護每個已注冊表的代理鍵。KeyManager 將提供兩個方法:/** *Intialize the KeyManger */ KeyManager.singleton(); /** *Return the unique surrogate key value according to the input table *name and column name. */ KeyManager. GetSurrogateKey(String tableName, String columnName); 要查看更詳細的 KeyManger 的代碼,請參考附錄。 第四,調用 KeyManger 來獲得主鍵值: … KeyManager km = KeyManager.singleton(); Long surrogateKey = km.getSurrogateKey("EMPLOYEE", "SERIALNUMBER"); … 優點和問題顯然,鍵管理器是模塊化設計的一個很好的例子。鍵管理器封裝了代理鍵生成函數。這種實現也易於定製。您可以在 KEYS 表中為 SURROGATEKEYVALUE 或 INCREMENT 指定不同的值,以得到不同的代理鍵。而且,這種實現可以在大多數資料庫系統上實施。但是,為了進行維護,需要一個單獨的表和編寫代碼。所以,這種方法更適合於大型的跨資料庫系統。 回頁首使用DB2 UDB 特性DB2 UDB 提供了三種方法來生成惟一值。您可以使用這些方法來實現代理鍵。DB2 UDB Version 6.1 中的 GENERATE_UNIQUE() SQL 函數。 DB2 UDB Version 7.2 中 CREATE TABLE 語句的 IDENTITY 選項。 DB2 UDB Version 7.2 中的 SEQUENCE 對象。 GENERATE_UNIQUE()解決方案的思想GENERATE_UNIQUE() 最初是在 DB2 UDB Version 6.1 中提供的一個 SQL 函數。該函數返回當前系統時間戳。我們可以使用該函數為代理鍵列生成惟一值。示例CREATE TABLE EMPLOYEE ( SERIALNUMBER CHAR(13) FOR BIT DATA NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然後可以用下面的 SQL 語句插入一行:INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(GENERATE_UNIQUE(), 『John』, 『Smith』, 999.99) 優點和問題這里需要清楚兩件事情。首先,當多個事務在同一時刻插入行時,GENERATE_UNIQUE() 可能會返回相同的時間戳。在這種情況下,GENERATE_UNIQUE() 不能為每個事務生成一個惟一的返回值,因而這種方法不適合有大量事務的系統。第二,一旦系統時鍾需要向後調整,那麼 GENERATE_UNIQUE() 將可能返回重復的值。 由於上述限制,我決不會在生產系統中使用 GENERATE_UNIQUE()。但是,當您需要在有限的時間內完成一個原型時,這也許是一種選擇。 CREATE TABLE 語句中的 IDENTITY 選項解決方案的思想IDENTITY 是 DB2 UDB Version 7.1 和後期版本提供的 CREATE TABLE 語句中的一個選項。在創建表時,可以將某個列指定為 IDENTITY 列。對於每條 INSERT 語句,DB2 將負責為其中的這一列生成一個惟一的值。 示例CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然後可以用下面的語句插入一行: INSERT INTO EMPLOYEE (FIRSTNAME, LASTNAME, SALARY) VALUES ( 『John』, 『Smith』, 999.99) INSERT 語句不需要指定 SERIALNUMBER 列的值。DB2 UDB 將根據列的定義自動生成惟一值,即 "GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)"。優點和問題IDENTITY 函數在大多數情況下是代理鍵函數的一個好的解決方案。DB2 import 和 export 實用程序也支持 IDENTITY 選項。然而,在某種情況下,這種解決方案不大方便。在運行 INSERT 語句之後,應用程序將永遠都不知道放入了主鍵列中的是什麼值。如果應用程序必須繼續向子表插入一個行,那麼它就不得不對父表運行一條 SELECT 語句,以得到主鍵值。不過,如果這一點對於您的系統不成問題的話,那麼使用 IDENTITY 選項是一個好主意。 SEQUENCE 對象解決方案的思想SEQUENCE 對象是在 DB2 UDB Version 7.2 中引入的一個特性。用戶可以在資料庫中創建一個 SEQUENCE 對象,就像創建表對象或視圖對象一樣,然後從 SEQUENCE 中請求值。DB2 保證用戶每次可以得到一個惟一的序列值。 示例您可以在資料庫中創建一個 SEQUENCE 對象:CREATE SEQUENCE EMPSERIAL AS BIGINT START WITH 1 INCREMENT BY 1 如果有一個如下所示的 EMPLOYEE 表: CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那麼可以用下面的語句插入一個行: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'John', 'Smith', 99.99) 在這里使用 " NEXTVAL FOR EMPSERIAL " 從 SEQUENCE 中獲得惟一值。 您可以使用 " PREVVAL FOR EMPSERIAL " 獲得當前連接會話中最近生成的序列值。應用程序就可以知道放入主鍵列中的是什麼值,從而繼續向子表插入一個行。這里,「在當前連接會話中」這一點很重要,這意味著 "PREVVAL" 將只返回在相同連接會話中生成的值。 例如,考慮這樣的情況:有兩個應用程序連接到資料庫,並按照如下順序運行下面的 SQL 語句。 (假設 SEQUENCE " EMPSERIAL " 的當前值是 3)。 應用程序 1:
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Martin', 'Wong', 1000.00)�0�2從EMPSERIAL 生成的 " NEXTVAL " 是 4。 應用程序 2:
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Patrick', 'Chan', 99.99) �0�2從EMPSERIAL 生成的 " NEXTVAL " 是 5。 應用程序 1:
SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE �0�2" PREVVAL " 將返回 4,而不是 5。 而且, PREVVAL 和NEXTVAL 的值不會受事務回滾的影響。 例如,假設 SEQUENCE " EMPSERIAL " 的當前值是 30。某個應用程序開始了一個事務: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'William', 'Chen', 99.99) 執行ROLLBACK 操作。 然後,如果運行: SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE 則" PREVVAL " 將返回 31,而不是 30。 優點和問題SEQUENCE 是最近 DB2 UDB 為生成惟一值而實現的函數。它還有一個緩存函數,用於提高性能(要了解詳細信息,請參閱 IBM DB2 UDB SQL Reference)。該函數比 IDENTITY 函數更靈活,因為它是資料庫中的一個獨立對象。必要時候,可以通過運行 ALTER SEQUENCE 語句更改其設置。 如果系統只在 DB2 UDB 上運行,那麼 SEQUENCE 也許是最好的解決方案,因為它易於使用,而且不像鍵管理器那樣需要額外的代碼,並且可以隨需求的變化很輕易對其進行更改。回頁首結束語本文描述了實現作為主鍵的代理鍵的三種方法。文中主要討論了如何為代理鍵生成惟一的序列值。傳統方法適合於簡單的、單用戶(非並發)系統。對於實現對於大型系統和跨平台系統,鍵管理器是一個好選擇。但是,如果項目只在 DB2 UDB 上運行的話,可以考慮 DB2 UDB 提供的特性。IDENTITY 和 SEQUENCE 函數提供了一種容易的、靈活的解決方案。在創建 IDENTITY 列和 SEQUENCE 對象時,可以使用很多選擇。請參閱 IBM DB2 UDB Administration Guide和IBM DB2 UDB SQL Reference,以獲得完整的細節。 回頁首附錄import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class KeyManager { private static KeyManager singleton; private PreparedStatement getKeyStmt = null; private PreparedStatement updateKeyStmt = null; static final String db2Driver = "COM.ibm.db2.jdbc.app.DB2Driver"; static final String db2UrlPfx = "jdbc:db2:"; public KeyManager Singleton() throws ClassNotFoundException, SQLException{ if (singleton == null) { if (singleton == null) singleton = new KeyManager(); } return singleton; } private KeyManager() throws ClassNotFoundException, SQLException{ Class.forName(db2Driver); Connection connection = DriverManager.getConnection(db2UrlPfx+ "dbName", "userName", "password"); getKeyStmt = connection.prepareStatement("SELECT SURROGATEKEYVALUE FROM KEYS WHERE TABLENAME = ? AND COLUMNNAME = ?"); updateKeyStmt = connection.prepareStatement("UPDATE KEYS SET SURROGATEKEYVALUE = SURROGATEKEYVALUE + INCREMENT WHERE TABLENAME = ? AND COLUMNNAME = ?"); } public Long getSurrogateKey(String tableName, String columnName) throws SQLException{ Long keyValue = null; getKeyStmt.setString(1, tableName); getKeyStmt.setString(2, columnName); updateKeyStmt.setString(1, tableName); updateKeyStmt.setString(2, columnName); updateKeyStmt.execute(); ResultSet rs = getKeyStmt.executeQuery(); if (rs.next() == true) { keyValue = new Long(rs.getLong(1)); } return keyValue; } } 參考資料 您可以參閱本文在 developerWorks 全球站點上的 英文原文.
IBM DB2 UDB Administration GuideIBM DB2 UDB SQL Reference關於作者�0�2Jason Zhang 是 IBM 加拿大多倫多的實驗室的一名軟體開發人員,從事電子商務開發已經有 5 年多的時間。

熱點內容
unturned怎麼不進伺服器聯機 發布:2024-10-09 07:24:17 瀏覽:392
javaoracle 發布:2024-10-09 07:23:32 瀏覽:560
安卓系統總是被殺後台怎麼辦 發布:2024-10-09 07:11:31 瀏覽:304
花雨庭伺服器如何全屏 發布:2024-10-09 06:39:28 瀏覽:213
密碼查看器怎麼使用 發布:2024-10-09 06:38:55 瀏覽:495
sqlrownum 發布:2024-10-09 06:28:53 瀏覽:384
F模塊驅動器編譯錯誤 發布:2024-10-09 06:06:21 瀏覽:636
腳本亞索集錦 發布:2024-10-09 05:53:30 瀏覽:877
安卓手機格式化後為什麼打不開 發布:2024-10-09 05:52:58 瀏覽:511
雲伺服器可以超級計算機嗎 發布:2024-10-09 05:51:33 瀏覽:17