MySQL и SQLite различия в SQL - PullRequest
6 голосов
/ 15 апреля 2009

Я пишу Java-приложение, которое использует SQLite и MySQL с использованием JDBC.

Существуют ли различия в SQL для этих баз данных? Могу ли я использовать одни и те же запросы для SQLite и MySQL , или есть какие-то специфические для БД вещи, которые не работают на другом?

Пока я работал только с MySQL , поэтому я не очень разбираюсь в SQLite .

Ответы [ 3 ]

5 голосов
/ 19 августа 2010

Я делаю что-то подобное. Есть несколько различий в дополнение к упомянутым, с которыми я столкнулся:

  • в более новых версиях SQLite3 с драйвером Xerial JDBC внешние ключи действительно поддерживаются. SQLite поддерживает встроенное определение ограничения внешнего ключа:
    CREATE TABLE Blah (foreignId Integer REFERENCES OtherTable (id));

    MySQL (с InnoDB) будет принимать с тем же синтаксисом, но на самом деле не будет применять ограничение, если вы не используете отдельное предложение FOREIGN KEY, в котором явно указаны внешние столбцы и ключевые столбцы:
    CREATE TABLE Blah (ForeignId INTEGER, FOREIGN KEY ForeignId ССЫЛКИ OtherTable (id));

  • старые версии драйвера SQLite JDBC не поддерживают Statement.RETURN_GENERATED_KEYS; исправлено в новых драйверах Xerial.

  • синтаксис для автоинкрементных ключей отличается; SQLite: (id INTEGER ПЕРВИЧНЫЙ КЛЮЧ ASC, ...); MySQL: (id INTEGER PRIMARY KEY AUTO_INCREMENT, ...)

  • SQLite принимает n-way соединения с разделителями-запятыми:
    ВЫБЕРИТЕ * ОТ A, B, C ON (A.x = B.y AND B.y = C.z);

    MySQL нет; следующие работы в обоих:
    ВЫБЕРИТЕ * ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ B НА A.x = B.y ВНУТРЕННЕЕ СОЕДИНЕНИЕ C ON B.y = C.z;

  • Что касается различий в типах, то раздражение, связанное с драйверами JDBC для SQLite, заключается в том, что один и тот же столбец может создавать различные типы с помощью ResultSet.getObject (.); например, Integer или Long в зависимости от величины содержащегося числа.

  • автоинкрементные ключи в SQLite ДОЛЖНЫ быть объявлены как тип INTEGER; в MySQL работает любой числовой целочисленный тип.

5 голосов
/ 15 апреля 2009

Если вы придерживаетесь ANSI SQL92 , у вас все будет хорошо.

В MySQL и SQLite отсутствуют некоторые функции SQL92 (например, FULL OUTER JOIN). MySQL имеет как RIGHT JOIN, так и LEFT JOIN, SQLite только LEFT JOIN. SQLite не поддерживает ограничения FOREIGN KEY, а также MySQL с таблицами MyISAM. Конечно, SQLite не имеет GRANT / REVOKE, так как система разрешений основана на разрешениях для файлов базовой ОС.

1 голос
/ 12 июня 2010

Большим отличием является система типа . SQLite позволяет вам помещать данные любого типа в любой столбец. Однако при возможности он приводит данные к объявленному типу столбца.

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