2009-05-02 75 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)都支持它。