Задавайте вопросы, мы ответим
Вы не зашли.
Есть SQL скрипт, который работает для Oracle, но, "в лоб", не работает для MySQL.
Вопрос, насколько сложно его будет переделать под MySQL ?
Типичные команды:
1) DROP TABLE test CASCADE CONSTRAINTS;
2) CREATE TABLE test (
EVENT_ID NUMBER(10) NOT NULL,
PARENT_EVENT_ID NUMBER(10) NOT NULL,
DATE_WHEN INTEGER NULL,
NAME NVARCHAR2(128) NULL,
IS_SCANNED INTEGER NULL,
TIME_ZONE NVARCHAR2(32) NULL
);
3) ALTER TABLE test
ADD ( CONSTRAINT XPKBF_EVENT PRIMARY KEY (EVENT_ID) ) ;
4) ALTER TABLE test
ADD ( CONSTRAINT R_64
FOREIGN KEY (EVENT_ID)
REFERENCES BF_EVENT ) ;
Неактивен
Сложность переделывания запросов зависит, разумеется, от самих
запросов и от Вашего знания SQL. Расширения SQL, придуманные Oracle,
в большинстве своем работать не будут, поэтому часть запросов усложнится.
По поводу Ваших примеров:
1. Такое удаление, разумеется, не сработает ни в таком виде, ни в случае
простого DROP TABLE. Вам необходимо вручную удалить все внешние ключи,
ссылающиеся на данную таблицу.
Список ссылок можно получить, например, из INFORMATION_SCHEMA:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
CONSTRAINT_TYPE = 'FOREIGN KEY' AND
TABLE_NAME = 'tablename' AND
CONSTRAINT_SCHEMA = 'dbname';
2. Типы данных называются немного по другому, но это все очень легко
параметризуется: NUMBER нужно заменить на DECIMAL, NVARCHAR2 на VARCHAR.
Разумеется, все операции с внешними ключами работают только в таблицах
InnoDB, поэтому лучше добавить ENGINE=InnoDB в конце операции создания
таблицы:
CREATE TABLE test (EVENT_ID DECIMAL (10) NOT NULL, ...) ENGINE=InnoDB;
3. В таких запросах нужно убрать все "лишние" слова. Т.е. нужно оставить
ALTER TABLE test ADD PRIMARY KEY (EVENT_ID);
4. Запрос аналогичный третьему:
ALTER TABLE test ADD FOREIGN KEY (EVENT_ID) REFERENCES reftable(refcolumn);
К сожалению, автоматизировать этот процесс вряд ли удастся, хотя наверняка
найдутся какие-то упрощения. Например, может оказаться, что в Вашем сценарии
много одинаковых кусков (отличающихся, например, названием таблиц). Тогда,
разумеется, Вы сможете сделать замену шаблоном.
Неактивен
А как сделать, чтобы при выполнении SQL сценария и появлении ошибки mysql продолжал бы выполнение (например, после DROP TABLE ..., если table не существует)?
Неактивен
Во-первых, Вы можете запускать клиент с ключом -f, тогда он будет продолжать
выполнение сценария, игнорируя все ошибки:
shell> mysql -f < myscript.sql
Во-вторых, в случае с DDL, Вы можете добавить специальные конструкции, которые
исключают появление ошибок. Например, для Вашего примера, можно использовать
DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test ( ... );
Второй способ предпочтительнее, разумеется, т.к. Вы можете отследить другие
возникающие ошибки.
Неактивен
Спасибо. Все помогло. Продвигаюсь дальше на своем пути к MySQL .
Неактивен