Ответ 1
Вы можете сделать
SELECT MAX(ID) FROM Customers;
Допустим, у меня есть следующие данные в таблице "Клиенты": (ничего более)
ID FirstName LastName
-------------------------------
20 John Mackenzie
21 Ted Green
22 Marcy Nate
Какого рода оператор SELECT
может дать мне номер 22 в столбце идентификатора?
Мне нужно сделать что-то вроде этого, чтобы создать уникальный идентификатор. Конечно, я могу позволить системе делать это с помощью автоинкремента, но тогда как мне получить автоматически сгенерированный идентификатор?
Я думал о SELECT ID FROM Customers
и подсчитывал возвращаемые строки, но это кажется ужасно неэффективным, и в этом случае он будет неправильно возвращать "3", хотя мне нужен уникальный идентификатор 23.
Вы можете сделать
SELECT MAX(ID) FROM Customers;
Если вы только что вставили запись в таблицу Customers и вам нужно значение недавно заполненного поля ID, вы можете использовать функцию SCOPE_IDENTITY
. Это полезно только тогда, когда INSERT
произошел в той же области, что и вызов SCOPE_IDENTITY
.
INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')
SET @mostRecentId = SCOPE_IDENTITY()
Это может или не может быть полезно для вас, но это хорошая техника, чтобы знать. Он также будет работать с автоматически генерируемыми столбцами.
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1
Затем получите идентификатор.
select max(id) from customers
Чтобы получить его в любое время, вы можете сделать SELECT MAX(Id) FROM Customers
.
В процедуре, которую вы добавили, однако, вы также можете использовать SCOPE_IDENTITY
-, чтобы получить идентификатор, последний добавленный этой процедурой.
Это безопаснее, потому что это гарантирует, что вы получите свой Id
- на случай, если другие будут добавлены в базу данных одновременно.
Если вы говорите о MS SQL, здесь наиболее эффективный способ. Это извлекает текущее семя идентичности из таблицы на основе того, какой столбец является идентификатором.
select IDENT_CURRENT('TableName') as LastIdentity
Использование MAX(id)
более общее, но, например, у меня есть таблица с 400 миллионами строк, для получения MAX(id)
требуется 2 минуты. IDENT_CURRENT
почти мгновенно...
select max(id) from Customers
Если вы используете AUTOINCREMENT
, используйте:
SELECT LAST\_INSERT\_ID();
Предполагая, что вы используете Mysql: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Postgres обрабатывает это аналогичным образом с помощью функции currval(sequence_name)
.
Обратите внимание, что использование MAX(ID)
небезопасно, если только вы не заблокируете таблицу, поскольку возможно (в упрощенном случае) выполнить другую вставку, которая происходит до того, как вы вызовете MAX(ID)
, и вы потеряете идентификатор первой вставки. Приведенные выше функции основаны на сеансах, поэтому, если вставляется другой сеанс, вы все равно получаете вставленный вами идентификатор.
Если вы не используете поля с автоматическим увеличением, вы можете добиться аналогичного результата с помощью следующего:
insert into Customers (ID, FirstName, LastName)
select max(ID)+1, 'Barack', 'Obama' from Customers;
Это не даст шансов на состояние гонки, которое может быть вызвано тем, что кто-то другой вставляет в таблицу между извлечением максимального идентификатора и вашей вставкой новой записи.
Это использует стандартный SQL, нет никаких сомнений в том, что его можно использовать с конкретными СУБД, но они не обязательно переносимы (что мы очень серьезно относимся к нашему магазину).
Вы также можете использовать реляционную алгебру. Немного продолжительная процедура, но здесь просто понять, как работает MAX():
E: = π ID (Table_Name)
E1: = π ID (σ ID >= ID ' ((ρ ID' E) ⋈ E)) - π ID (σ ID < ID ((p ID ' E) ⋈ E))
Ваш ответ: Table_Name ⋈ E1
В основном вы вычитаете набор упорядоченного отношения (a, b), в котором a <
b из A, где a, b ∈ A.
Для символов алгебры связей см. Реляционная алгебра Из Википедии
Зависит от того, какую реализацию SQL вы используете. Как MySQL, так и SQLite, например, имеют способы получить последний идентификатор вставки. На самом деле, если вы используете PHP, есть даже отличная функция для именно этого mysql_insert_id().
Вероятно, вам стоит использовать эту функцию MySQL вместо того, чтобы смотреть на все строки, чтобы получить самый большой идентификатор вставки. Если ваш стол становится большим, это может стать очень неэффективным.
Если вы хотите просто выбрать id
, используйте select max(id) from customer
.
Если вы хотите выделить всю строку, используйте следующий запрос:
select c1.*
from customer c1, (select max(id) as max_id from customer )c2
where c1.id=c2.max_id
c2
- это псевдоним новой временной таблицы, которая содержит max id
. Затем его перекрестный продукт берется из таблицы клиентов, чтобы получить всю строку.
Здесь мы пишем запрос в предложении from, который часто может быть весьма полезным.
select * from tablename order by ID DESC
который даст вам строку с идентификатором 22
В PHP:
$sql = mysql_query("select id from customers order by id desc");
$rs = mysql_fetch_array($sql);
if ( !$rs ) { $newid = 1; } else { $newid = $rs[newid]+1; }
таким образом $newid = 23
, если последняя запись в столбце равна 22.