数据库自动增量列

时间:2009-05-02 00:08:38

标签: sql

是否可以创建一个具有1列(但不是主键列)的数据库自动递增?因此,当我向数据库插入值时,我不需要自己填写值,DB将为我填写该列的值(并在每次执行新插入时递增)?

谢谢。

5 个答案:

答案 0 :(得分: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`)
);

答案 1 :(得分:4)

是的,你可以这样做。以下是使用 IDENTITY SQL Server 的示例:

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 :(得分:2)

我认为每个表只能有一个身份自动增量列,这些列不一定是主键,但这意味着你必须自己插入主键。

如果您已经有一个自动递增的主键,那么我会尝试使用它。如果可能的话。

如果您尝试获取用于查询的行ID,那么我将查看创建其中包含行ID的视图(不是SQL 2000或更低版本)。

您可以添加主键是什么以及您打算使用自动增量列的内容,它可能有助于提出解决方案

答案 3 :(得分:0)

在sql server上,这称为identity

答案 4 :(得分:0)

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