powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Получить rowid последней добавленной записи в таблицу
8 сообщений из 8, страница 1 из 1
Получить rowid последней добавленной записи в таблицу
    #38203363
heliogracie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был бы благодарен за помощь. Собственно не могу правильно организовать условие, в котором если запись в таблице существует, то вернуть rowid этой записи, если же не существует то добавить эту запись в таблицу и вернуть её rowid. Пишу на C#. Версия фреймворка 4.0. Блок if возвращает rowid верный, но вот else выдает постоянно rowid равный 1.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
        static void Main(string[] args)
        {
            string dbName = "Data Source=searchindex.db";

            using (SQLiteConnection con = new SQLiteConnection(dbName))
            {
                con.Open();

                using (SQLiteCommand cmd = new SQLiteCommand(con))
                {

                    cmd.CommandText = "SELECT count(rowid) FROM wordlist WHERE word='milk'";
                    int countRows = Convert.ToInt32(cmd.ExecuteScalar());
                    
                    if (countRows == 0) // Если запись не существует в таблице, добавляем её в таблицу и получаем её rowid
                    {
                        cmd.CommandText = "INSERT INTO wordlist(word) VALUES ('milk')";
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = "SELECT last_insert_rowid()";
                        int lastId = Convert.ToInt32(cmd.ExecuteScalar());
                        Console.WriteLine("inserting rowid {0}", lastId);
                    }
                    else // Иначе просто возвращаем rowid
                    {
                        SQLiteDataReader res = cmd.ExecuteReader();
                        Console.WriteLine("selecting rowid {0}", res[0]);
                        res.Close();
                    }
               }
          }
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38203390
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heliogracie, может потому, что для else выполняется точно такой же запрос, который используется для проверки select count -- хотя должен был бы вызываться просто select rowid. Не?
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38203394
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heliogracieБлок if возвращает rowid верныйНеправда. select count(rowid) выдаст тебе количество строк в таблице, а не номер последней записи.

А вообще, для подобных задач есть универсальное решение:
Если word это PK, то вставить новую запись если такой еще нет:
insert into wordlist (word) select 'milk' where not exists (select * from wordlist where word='milk');



Ну а потом если очень надо - прочитать rowid:
select rowid from wordlist where word='milk';
Но я очень-очень-очень не советую работать с rowid.
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38203416
heliogracie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlheliogracieБлок if возвращает rowid верныйНеправда. select count(rowid) выдаст тебе количество строк в таблице, а не номер последней записи.

А вообще, для подобных задач есть универсальное решение:
Если word это PK, то вставить новую запись если такой еще нет:
insert into wordlist (word) select 'milk' where not exists (select * from wordlist where word='milk');



Ну а потом если очень надо - прочитать rowid:
select rowid from wordlist where word='milk';
Но я очень-очень-очень не советую работать с rowid.

Большое спасибо.
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38203528
Поделись, почему "очень-очень-очень", а не просто "не советую"
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38204785
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван СерёгинПоделись, почему "очень-очень-очень", а не просто "не советую"Потому что rowid удобен и люди (не обязательно новички) могут с легкостью наваять систему работающую на основе rowid. И будет она замечательно жить, до тех пор пока не придет vacuum или перестройка базы. И вот тут-то пушной зверек и проявится.... Ошибок ты никаких не увидишь, но целостность данных станет воспоминанием.
rowid это физическая вещь, это не настоящий ключ и даже не суррогатный ключ, это внутренняя вещь которая по хорошему не должна быть видима вообще. Hipp очень сглупил сделав его доступным публике.
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38204823
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИван СерёгинПоделись, почему "очень-очень-очень", а не просто "не советую"Потому что rowid удобен и люди (не обязательно новички) могут с легкостью наваять систему работающую на основе rowid. И будет она замечательно жить, до тех пор пока не придет vacuum или перестройка базы. И вот тут-то пушной зверек и проявится.... Ошибок ты никаких не увидишь, но целостность данных станет воспоминанием.
rowid это физическая вещь, это не настоящий ключ и даже не суррогатный ключ, это внутренняя вещь которая по хорошему не должна быть видима вообще. Hipp очень сглупил сделав его доступным публике.
В документации на SQLite пишут, что primary key таблицы, будь он целым числом, автоматом маппится на внутренний rowid и фактически становится его алиасом при работе.
...
Рейтинг: 0 / 0
Получить rowid последней добавленной записи в таблицу
    #38204916
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiВ документации на SQLite пишут, что primary key таблицы, будь он целым числом, автоматом маппится на внутренний rowid и фактически становится его алиасом при работе.Но в этом случае у тебя будет нормальное поле для работы. На него можно будет ссылаться из внешних ключей и его значение будет сохраняться при vacuum. То что оно совпадает с rowid это внутренние дела СУБД.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Получить rowid последней добавленной записи в таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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