2009-05-02 70 views
2

是否有可能創建一個數據庫有1列(但不是主鍵列)自動增量?因此,當我向數據庫插入值時,我不需要自己填寫值,DB會爲我填充該列的值(並且每次執行新插入時都會增加)?數據庫自動增加列

謝謝。

+4

執行此操作的方法是DBMS相關的。你正在使用哪個DBMS? – Rob 2009-05-02 00:13:19

回答

0

上的SQL Server,這稱爲identity

5

是的,當然是可以的。只需將此列作爲唯一鍵(不是主鍵),並且必須使用特殊屬性(SQL Server的「IDENTITY」)和MySQL的 「AUTO_INCREMENT」(請參見下面的示例)來聲明。另一列可以是主鍵。

在MySQL數據庫中的表可以聲明如下:

CREATE TABLE `mytable` (
    `Name` VARCHAR(50) NOT NULL, 
    `My_autoincrement_column` INTEGER(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`Name`), 
    UNIQUE KEY `My_autoincrement_column` (`My_autoincrement_column`) 
);
4

是的,你可以做到這一點。下面是使用IDENTITYSQL服務器樣本:

CREATE TABLE MyTable (
    PrimaryKey varchar(10) PRIMARY KEY, 
    IdentityColumn int IDENTITY(1,1) NOT NULL, 
    DefaultColumn CHAR(1) NOT NULL DEFAULT ('N') 
) 

INSERT INTO MyTable (PrimaryKey) VALUES ('A') 
INSERT INTO MyTable (PrimaryKey) VALUES ('B') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('C', 'Y') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('D', 'Y') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('E', DEFAULT) 

--INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('F', NULL) -- ERROR 
--> Cannot insert the value NULL into column 'DefaultColumn', table 'tempdb.dbo.MyTable'; column does not allow nulls. INSERT fails. 

SELECT * FROM MyTable 

下面是一個使用功能滾你自己的遞增列使用SQL Server的實例。這意味着沒有容錯或者我會這樣做。 (我會使用身份識別功能。)但是,知道您可以使用函數返回默認值。

DROP TABLE MyTable 
GO 
DROP FUNCTION get_default_for_mytable 
GO 

CREATE FUNCTION get_default_for_mytable 
() 
RETURNS INT 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @ResultVar int 

    -- Add the T-SQL statements to compute the return value here 
    SET @ResultVar = COALESCE((SELECT MAX(HomeBrewedIdentityColumn) FROM MyTable),0) + 1 

    -- Return the result of the function 
    RETURN @ResultVar 

END 
GO 

CREATE TABLE MyTable (
    PrimaryKey varchar(10) PRIMARY KEY, 
    IdentityColumn int IDENTITY(1,1) NOT NULL, 
    DefaultColumn CHAR(1) NOT NULL DEFAULT ('N'), 
    HomeBrewedIdentityColumn int NOT NULL DEFAULT(dbo.get_default_for_mytable()) 
) 
GO 

INSERT INTO MyTable (PrimaryKey) VALUES ('A') 
INSERT INTO MyTable (PrimaryKey) VALUES ('B') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('C', 'Y') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('D', 'Y') 
INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('E', DEFAULT) 

--INSERT INTO MyTable (PrimaryKey, DefaultColumn) VALUES ('F', NULL) -- ERRROR 
--> Cannot insert the value NULL into column 'DefaultColumn', table 'tempdb.dbo.MyTable'; column does not allow nulls. INSERT fails. 

SELECT * FROM MyTable 

結果

PrimaryKey IdentityColumn DefaultColumn HomeBrewedIdentityColumn 
---------- -------------- ------------- ------------------------ 
A   1    N    1 
B   2    N    2 
C   3    Y    3 
D   4    Y    4 
E   5    N    5 
2

我認爲你可以爲每個表中只有1身份自動增量列,此列不必是主鍵,但它意味着你必須插入主鍵你自己。

如果你已經有一個主鍵是自動增量,那麼我會盡量使用這個如果可能的話。

如果您試圖獲取一個行ID進行查詢範圍然後我會看看創建一個視圖,其中有行ID(不是SQL 2000或以下)。

你能在你打算使用自動增量列你的主鍵是什麼增加,並可能有助於想出了一個解決方案

0

Oracle和DB2有序列,但我認爲你正在尋找身份和所有主要的dbms(mysql,sql server,db2,oracle)都支持它。