Sqlite не возвращает правильный первичный ключ в php [duplicate]

ASCII - это файл TEXT, поэтому вы должны использовать Readers для чтения. Java также поддерживает чтение из двоичного файла с помощью InputStreams . Если прочитанные файлы огромны, вы можете использовать BufferedReader поверх FileReader , чтобы улучшить производительность чтения.

Пройдите через в этой статье о том, как использовать Reader

Я также рекомендую вам скачать и прочитать эту замечательную (но бесплатную) книгу под названием Мышление на Java

В Java 7:

new String (Files.readAllBytes (...)) или Files.readAllLines (...)

В Java 8:

Files.lines (..). forEach (...)

15
задан Benoit 17 January 2012 в 12:31
поделиться

5 ответов

SQLite

Это доступно с помощью функции SQLite last_insert_rowid() :

Функция last_insert_rowid () возвращает ROWID последнего вставка строки из соединения с базой данных, которое вызывает функцию. Функция last_insert_rowid () SQL является оболочкой вокруг функции интерфейса sqlite3_last_insert_rowid () C / C ++.

PHP

Версия PHP / привязка этой функции - sqlite_last_insert_rowid() :

Возвращает rowid строки, которая была недавно вставлена ​​в базу данных dbhandle, если она была создана как поле с автоматическим приращением.

19
ответ дан Treffynnon 19 August 2018 в 05:01
поделиться
  • 1
    что использование этой функции не является «потокобезопасным», поэтому, если другой поток вставляет что-то в одно и то же время, может быть неправильно. – rogerdpack 4 October 2016 в 23:21
  • 2
    @rogerdpack, есть ли у вас ссылка на то, что это не потокобезопасно? Ссылка, содержащаяся в ответе, гласит, что она предоставляет последнюю строку вставки "из соединения с базой данных, которая вызвала функцию" ), что привело бы меня к мысли, что это является threadsafe если у вас несколько потоков, использующих одно и то же соединение. Если у вас было несколько потоков, вставляемых через разные соединения, то каждый поток будет правильно видеть последний идентификатор строки, в который вставлен один и тот же поток (обычно это будет использоваться, как и LAST_INSERT_ID (), который OP хочет имитировать). – MikeThomson 26 January 2017 в 19:07
  • 3
    @MikeThomson fair question: sqlite.org/c3ref/last_insert_rowid.html "Если отдельный поток выполняет новый INSERT в том же соединении с базой данных, в то время как функция sqlite3_last_insert_rowid () запущена и, таким образом, изменяет последнюю вставку rowid, то значение, возвращаемое sqlite3_last_insert_rowid (), непредсказуемо и может не совпадать ни с старым, ни с последним вставкой rowid. & quot; См. Также stackoverflow.com/q/2127138/32453 – rogerdpack 26 January 2017 в 21:41
  • 4
    Я вижу, хорошее разъяснение – MikeThomson 1 February 2017 в 18:15

Он имеет last_insert_rowid()

Функция last_insert_rowid () возвращает ROWID последней вставки строки из соединения с базой данных, которое вызывало функцию

4
ответ дан Alex K. 19 August 2018 в 05:01
поделиться

При использовании SQLite версии 3 с PDO SQLite, это может быть так:

$insert = "INSERT INTO `module` (`mid`,`description`) VALUES (
            NULL,
            :text
            );
        ";
$stmt = $conn->prepare($insert);
$stmt->execute(array(':text'=> $text));

echo $conn->lastInsertId()
12
ответ дан Behzad-Ravanbakhsh 19 August 2018 в 05:01
поделиться

Это короткий метод C #, который работает для меня. Int32 достаточно большой для моих целей.

public static Int32 GetNextID( SqliteConnection AConnection )
{
  Int32 result = -1;

  using ( SqliteCommand cmd = AConnection.CreateCommand() )
  {
    cmd.CommandText = "SELECT last_insert_rowid();";
    using ( SqliteDataReader r = cmd.ExecuteReader() )
    {
      if ( r.Read() )
        result = (Int32) r.GetInt64( 0 );
    }
  }

  return result;
}
0
ответ дан Gary Z 19 August 2018 в 05:01
поделиться
2
ответ дан pltvs 19 August 2018 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: