2009-05-02 4 views
2

Возможно ли создать базу данных с 1 столбцом (но не столбцом первичного ключа) для автоматического увеличения? Поэтому, когда я вставляю значение в базу данных, мне не нужно заполнять значение самостоятельно, и БД будет заполнять это значение для этого столбца для меня (и увеличивать каждый раз, когда я делаю новую вставку)?Столбец автоинкремента базы данных

спасибо.

+4

Метод для этого зависит от СУБД. Какие СУБД вы используете? – Rob

+0

Возможно, из-за использования термина «автоинкремент» это MySQL – Trey

ответ

5

Да, конечно, это возможно. Просто сделайте этот столбец уникальным ключом (а не первичным ключом), и его нужно объявить со специальным атрибутом: «IDENTITY» для SQL Server и «AUTO_INCREMENT» для MySQL (см. Пример ниже). И другой столбец может быть первичным ключом.

В базе данных 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

Да, вы можете сделать это. Вот пример для SQL Server с помощью IDENTITY:

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

Я думаю, что вы можете иметь только один столбец идентичности автоинкрементного для каждой таблицы, эти столбцы не должны быть первичным ключом, но это будет означать, что вам нужно вставить первичный ключ самостоятельно.

Если у вас уже есть первичный ключ, который является автоматическим приращением, я бы попытался использовать его, если это возможно.

Если вы пытаетесь получить идентификатор строки для диапазона для запроса, я бы посмотрел на создание представления, в котором есть идентификатор строки (не SQL 2000 или ниже).

Не могли бы вы добавить в том, что ваш первичный ключ является и то, что вы собираетесь использовать столбец автоматического инкремента и это может помочь придумать решение

0

Oracle и DB2 имеют последовательности, но я думаю, что вы ищете идентичности и все основные dbms (mysql, sql server, db2, oracle) поддерживают его.

Смежные вопросы