SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.04.2007 15:33:39

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Переделать SQL скрипт от Oracle для MySQL?

Есть SQL скрипт, который работает для Oracle, но, "в лоб", не работает для MySQL.

Вопрос, насколько сложно его будет переделать под MySQL smile?

Типичные команды:

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 ) ;

Неактивен

 

#2 02.04.2007 19:13:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6732

Re: Переделать SQL скрипт от Oracle для MySQL?

Сложность переделывания запросов зависит, разумеется, от самих
запросов и от Вашего знания 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);

К сожалению, автоматизировать этот процесс вряд ли удастся, хотя наверняка
найдутся какие-то упрощения. Например, может оказаться, что в Вашем сценарии
много одинаковых кусков (отличающихся, например, названием таблиц). Тогда,
разумеется, Вы сможете сделать замену шаблоном.

Неактивен

 

#3 03.04.2007 14:03:23

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Переделать SQL скрипт от Oracle для MySQL?

А как сделать, чтобы при выполнении SQL сценария и появлении ошибки mysql продолжал бы выполнение (например, после DROP TABLE ..., если table не существует)?

Неактивен

 

#4 03.04.2007 16:53:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6732

Re: Переделать SQL скрипт от Oracle для MySQL?

Во-первых, Вы можете запускать клиент с ключом -f, тогда он будет продолжать
выполнение сценария, игнорируя все ошибки:

shell> mysql -f < myscript.sql

Во-вторых, в случае с DDL, Вы можете добавить специальные конструкции, которые
исключают появление ошибок. Например, для Вашего примера, можно использовать

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test ( ... );

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

Неактивен

 

#5 03.04.2007 17:04:03

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Переделать SQL скрипт от Oracle для MySQL?

Спасибо. Все помогло. Продвигаюсь дальше на своем пути к MySQL smile.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson