powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / значение автоинкримента
25 сообщений из 26, страница 1 из 2
значение автоинкримента
    #36591122
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни привет! БД SQLITE, делаю INSERT. Можно ли уже в запросе узнать значение поля автоинкримента и продублировать его в одной из ячеек, например?

br,
grio.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36591268
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без триггера наврядли. А вот есть ли в SQLLITE триггеры - не уверен.

Да и потом, а зачем сразу, если потом достаточно один UPDATE сделать.

Модератор: Тема перенесена из форума "Вопрос-Ответ".
...
Рейтинг: 0 / 0
значение автоинкримента
    #36591699
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
Без триггера можно так
create table t1(id integer primary key autoincrement, name);
insert into t1 values(null, (select seq from sqlite_sequence where name='t1')+ 1 );
...
Рейтинг: 0 / 0
значение автоинкримента
    #36591721
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
select last_insert_rowid()
...
Рейтинг: 0 / 0
значение автоинкримента
    #36595752
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev, почти... но не то.
я имел ввиду такой вариант использования:
Код: plaintext
INSERT INTO table VALUES (NULL, last_insert_rowid())
(Первое поле в таблице ID INTEGER PRIMARY KEY AUTOINCREMENT)
Только нужно получить не предыдущее, а текущее значение.
Типа current_insert_rowid(), но этой функции, к сожалению пока нет.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36595822
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю подобная функция нарушает правила нормализации реляционной БД.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36596455
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grioDmitry Arefiev, почти... но не то.
я имел ввиду такой вариант использования:
Код: plaintext
INSERT INTO table VALUES (NULL, last_insert_rowid())
(Первое поле в таблице ID INTEGER PRIMARY KEY AUTOINCREMENT)
Только нужно получить не предыдущее, а текущее значение.
Типа current_insert_rowid(), но этой функции, к сожалению пока нет.
А постом выше я что написала?
...
Рейтинг: 0 / 0
значение автоинкримента
    #36596558
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЯИра,
к сожалению, не годится твой вариант тоже. Ты же не знаешь наверняка что значение будет всегда на единицу больше. Потому что автоинкримент может заполнять пустоты в середине списка, например.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36596631
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grio,

а ты пробывал :)
...
Рейтинг: 0 / 0
значение автоинкримента
    #36608902
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЯИра,

Достаточно проблематично сэмулировать ситуацию, когда автоинкримент достиг максимального значения. Однако, в принципе, такое возможно. И тогда твой код начнет вести себя весьма странно.
Если не заморачиваться возможными последствиями, то твое решение вполне годится, как, например, временное.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36609026
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
grioЯИра,
к сожалению, не годится твой вариант тоже. Ты же не знаешь наверняка что значение будет всегда на единицу больше. Потому что автоинкримент может заполнять пустоты в середине списка, например.

Не выдумывайте. AUTOINCREMENT всегда на единицу больше предыдущего максимального значения.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36610932
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

Тогда позвольте спросить, что происходит, когда автоинкримент достигает порога для указанного типа данных INTEGER или REAL?
...
Рейтинг: 0 / 0
значение автоинкримента
    #36611017
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простой эксперимент показывает, что будет ошибка при вставке новой записи SQLITE_FULL

в доке написано
автор
If no ROWID is specified on the insert, or if the specified ROWID has a value of NULL, then an appropriate ROWID is created automatically. The usual algorithm is to give the newly created row a ROWID that is one larger than the largest ROWID in the table prior to the insert. If the table is initially empty, then a ROWID of 1 is used. If the largest ROWID is equal to the largest possible integer (9223372036854775807) then the database engine starts picking candidate ROWIDs at random until it finds one that is not previously used. If no unused ROWID can be found after a reasonable number of attempts, the insert operation fails with an SQLITE_FULL error.


но на деле не ищется "пропущенное значение"
...
Рейтинг: 0 / 0
значение автоинкримента
    #36611570
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
ЯИраПростой эксперимент показывает, что будет ошибка при вставке новой записи SQLITE_FULL

в доке написано
автор
If no ROWID is specified on the insert, or if the specified ROWID has a value of NULL, then an appropriate ROWID is created automatically. The usual algorithm is to give the newly created row a ROWID that is one larger than the largest ROWID in the table prior to the insert. If the table is initially empty, then a ROWID of 1 is used. If the largest ROWID is equal to the largest possible integer (9223372036854775807) then the database engine starts picking candidate ROWIDs at random until it finds one that is not previously used. If no unused ROWID can be found after a reasonable number of attempts, the insert operation fails with an SQLITE_FULL error.


но на деле не ищется "пропущенное значение"

Вы в документации всегда только первый абзац читаете?.. Читайте дальше, там есть отдельная секция про AUTOINCREMENT.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36611824
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я плохо язык знаю, не очень поняла, что там дальше написано, но судя по тому, как работает движок базы, при максимальном значении integer в sqlite_seqгence, вставка новой записи приводит к ошибке, а не к поиску незанятых значений(когда пробывала, добавляла в таблицу одну запись, апдейтила sqlite_seqгence до максимального значения по документации и вновь добавляла запись)
...
Рейтинг: 0 / 0
значение автоинкримента
    #36611895
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯИраЯ плохо язык знаю, не очень поняла, что там дальше написано, но судя по тому, как работает движок базы, при максимальном значении integer в sqlite_seqгence, вставка новой записи приводит к ошибке, а не к поиску незанятых значений(когда пробывала, добавляла в таблицу одну запись, апдейтила sqlite_seqгence до максимального значения по документации и вновь добавляла запись)Берешься за компилятор - учи английский. Аксиома такая.
Если поле объявлено как AUTOINCREMENT, то заполнение дырок в нумерации строк запрещено.
Следующее значение AUTOINCREMENT поля всегда на единицу больше чем максимальное значание этого поля в существующей или когда-то сущестовавшей строке.
Всё.

Все что написано ранее про заполнение дырок в порядке нумерования не имеет никакой практической пользы. Это все внутренние дела базы которые вообще-то не должны были быть описаны в руководстве по SQL диалекту.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36611916
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

спасибо, буду знать!
...
Рейтинг: 0 / 0
значение автоинкримента
    #36612489
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
White Owl[quot ЯИра]
Все что написано ранее про заполнение дырок в порядке нумерования не имеет никакой практической пользы. Это все внутренние дела базы которые вообще-то не должны были быть описаны в руководстве по SQL диалекту.

Имеет оно практическое значение - если не объявить ключевое слово AUTOINCREMENT для ключа, то последовательность ключей станет немонотонная. На практике этого поведения стоит избегать, но оно может быть необходимо для гигантских разреженных таблиц, когда заведомо известно, что идентификаторов может не хватить.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36613255
grio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для меня теперь все прояснилось с автоинкриментом.
Спасибо, парни, спасибо, ЯИра, твой вариант запроса беру на вооружение )
...
Рейтинг: 0 / 0
значение автоинкримента
    #36613576
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGИмеет оно практическое значение - если не объявить ключевое слово AUTOINCREMENT для ключа, то последовательность ключей станет немонотонная.Какая последовательность?
Код: plaintext
CREATE TABLE test1(a INTEGER PRIMARY KEY, b TEXT);
Ты где-то здесь видишь последовательность? Какая к чертям последовательность если значение первичного ключа в этой таблице клиент должен задавать ручками? Совпадает ли заданый первичный ключ с внутренним автоматическим мне до лампочки. Я в любом случае вынужден при вставке в эту таблицу самостоятельно задавать значение для поля a .
...
Рейтинг: 0 / 0
значение автоинкримента
    #36613647
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
White OwlMBGИмеет оно практическое значение - если не объявить ключевое слово AUTOINCREMENT для ключа, то последовательность ключей станет немонотонная.Какая последовательность?
Код: plaintext
CREATE TABLE test1(a INTEGER PRIMARY KEY, b TEXT);
Ты где-то здесь видишь последовательность? Какая к чертям последовательность если значение первичного ключа в этой таблице клиент должен задавать ручками? Совпадает ли заданый первичный ключ с внутренним автоматическим мне до лампочки. Я в любом случае вынужден при вставке в эту таблицу самостоятельно задавать значение для поля a .

Похоже, вы хорошо отпраздновали 1-е мая :-)

Все вы перепутали - PRIMARY KEY генерируется автоматически, по вышеназванному алгоритму. Ключевое слово AUTOINCREMENT изменяет алгоритм генерации. И вручную задавать PK вовсе нет необходимости:
Код: plaintext
1.
2.
3.
4.
5.
6.
sqlite> CREATE TABLE test1(a INTEGER PRIMARY KEY, b TEXT);
sqlite> insert into test1 (b) values (NULL);
sqlite> insert into test1 (b) values (NULL);
sqlite> select * from test1;
 1 |
 2 |
...
Рейтинг: 0 / 0
значение автоинкримента
    #36613670
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGПохоже, вы хорошо отпраздновали 1-е мая :-)Я один человек а не группа товарищей. И нет, я не праздновал, первого и второго мая я сочинения писал.

MBGИ вручную задавать PK вовсе нет необходимости:
Код: plaintext
1.
2.
3.
4.
5.
6.
sqlite> CREATE TABLE test1(a INTEGER PRIMARY KEY, b TEXT);
sqlite> insert into test1 (b) values (NULL);
sqlite> insert into test1 (b) values (NULL);
sqlite> select * from test1;
 1 |
 2 |
эээээ..... Признаю, был не прав.
Впрочем, это еще одна уникальная особенность SQLite :( В других базах значение первичного ключа должно быть задано либо клиентом, либо через какой-либо вариант вычисляемого выражения. Простое объявление поля первичным ключом обычно не работает.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36679054
Фотография OracleLover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на кой черт он тогда называется автоинкрементом если все равно лепишь вот такие конструкции?

Код: plaintext
insert into t1 values(null, (select seq from sqlite_sequence where name='t1')+ 1 );

автоинкремент по логике вообще не должен в запросе учавствовать, все, мы вообще должны забыть про него. Это питомец самой таблицы.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36679099
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleLoverна кой черт он тогда называется автоинкрементом если все равно лепишь вот такие конструкции?

Код: plaintext
insert into t1 values(null, (select seq from sqlite_sequence where name='t1')+ 1 );

автоинкремент по логике вообще не должен в запросе учавствовать, все, мы вообще должны забыть про него. Это питомец самой таблицы.О господи! Читать букварь! Срочно читать букварь!
http://sql.ru/docs/sql/u_sql/ch15.shtml#15.4
И привыкать перечислять поля таблицы в которые делается вставка.
...
Рейтинг: 0 / 0
значение автоинкримента
    #36679852
Фотография OracleLover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlOracleLoverна кой черт он тогда называется автоинкрементом если все равно лепишь вот такие конструкции?

Код: plaintext
insert into t1 values(null, (select seq from sqlite_sequence where name='t1')+ 1 );

автоинкремент по логике вообще не должен в запросе учавствовать, все, мы вообще должны забыть про него. Это питомец самой таблицы.О господи! Читать букварь! Срочно читать букварь!
http://sql.ru/docs/sql/u_sql/ch15.shtml#15.4
И привыкать перечислять поля таблицы в которые делается вставка.

спасибо :), только это ни я! это ЯИра напесала - я с горяча и подумал что так работает
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / SQLite [игнор отключен] [закрыт для гостей] / значение автоинкримента
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]