Столбец автоинкремента базы данных - PullRequest
2 голосов
/ 02 мая 2009

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

Спасибо.

Ответы [ 5 ]

5 голосов
/ 02 мая 2009

Да, конечно, это возможно. Просто сделайте этот столбец уникальным ключом (не первичным ключом), и его необходимо объявить с помощью специального атрибута: «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 голосов
/ 02 мая 2009

Да, вы можете сделать это. Вот пример для 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 голосов
/ 02 мая 2009

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

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

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

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

0 голосов
/ 02 мая 2009

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

0 голосов
/ 02 мая 2009

На сервере sql это называется идентификатор столбец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...