2015-11-09 8 views
4

Я переношу некоторые Postgres SQL в MySQL и пытаюсь установить начальные значения трех столбцов на определенные значения. Таблица выглядит следующим образом:Postgres Sequence Port to MySQL

CREATE TABLE ITEM (
ORDID    NUMERIC(4) NOT NULL, 
ITEMID    NUMERIC(4) NOT NULL, 
PRODID    NUMERIC(6), 
ACTUALPRICE   NUMERIC(8,2), 
QTY     NUMERIC(8), 
ITEMTOT    NUMERIC(8,2), 
CONSTRAINT ITEM_FOREIGN_KEY FOREIGN KEY (ORDID) REFERENCES ORD (ORDID), 
CONSTRAINT ITEM_PRIMARY_KEY PRIMARY KEY (ORDID,ITEMID)); 

код, который я пытаюсь порта следующим образом:

CREATE SEQUENCE ORDID 
INCREMENT BY 1 
START WITH 622 
; 

CREATE SEQUENCE PRODID 
INCREMENT BY 1 
START WITH 200381 
; 

CREATE SEQUENCE CUSTID 
INCREMENT BY 1 
START WITH 109 
; 

Однако при попытке запуска этого я получаю сообщение об ошибке:

SQL query: 

CREATE SEQUENCE ORDIDINCREMENT BY 1 START WITH 622 ; 


MySQL said: Documentation 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEQUENCE ORDID 
INCREMENT BY 1 
START WITH 622' at line 1 

Я знаю, что нет прямого эквивалента SEQUENCE в MySQL, но я не могу найти разумный способ добиться того же самого без него. Есть идеи?

ответ

2

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

Unfortunately you can only have one per table.

There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value.

И они должны быть целыми числами, числовая не работает. Это, вероятно, улучшит вашу схему, поскольку 9999 заказов и предметов кажется очень маленьким.

AUTO_INCREMENT applies only to integer and floating-point types.

И если этого недостаточно, вы не можете использовать AUTO_INCREMENT для первичного ключа с несколькими ключами. Это позволяет использовать только формат таблицы MyISAM.

Так что вы не можете легко перевести ваши таблицы PostgreSQL в MySQL дословно.

Вы уверены, что хотите преобразовать в MySQL?


В вашем случае item.ordid является ссылкой, так что будет увеличиваться в своей таблице. item.prodid, вероятно, также является ссылкой, и кто-то забыл объявить об этом. Это оставляет только item.itemid, который будет объявлен AUTO_INCREMENT, но это часть первичного ключа. Это, вероятно, не обязательно, это может быть просто уникальным.

Фактически, таблица ITEM выглядит скорее как отслеживание заказов продуктов, а не предметов ... но тогда есть также идентификатор продукта? Я не знаю, что такое «предмет».

Вы завершаете с чем-то вроде этого:

CREATE TABLE ITEM (
     ITEMID    INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     PRODID    INTEGER REFERENCES PROD(PRODID), 
     ORDID    INTEGER NOT NULL REFERENCES ORD (ORDID), 
     ACTUALPRICE   NUMERIC(8,2), 
     QTY     NUMERIC(8), 
     ITEMTOT    NUMERIC(8,2), 

     UNIQUE(ORDID, ITEMID) 
) 

CREATE TABLE ORD (
     ORDID    INTEGER PRIMARY KEY AUTO_INCREMENT, 
     ... 
) AUTO_INCREMENT = 622; 

CREATE TABLE PROD (
     PRODID    INTEGER PRIMARY KEY AUTO_INCREMENT, 
     ... 
) AUTO_INCREMENT = 200381; 

Вы также можете установить AUTO_INCREMENT отправную точку после факта с помощью ALTER TABLE. Поскольку это атрибут таблицы, а не атрибут столбца, это происходит на самой таблице.

ALTER TABLE CUST AUTO_INCREMENT=109; 

Это в значительной степени ненужное установить AUTO_INCREMENT отправную точку, если вы импортируете существующий набор данных. AUTO_INCREMENT всегда будет использовать MAX(column), и он не может быть установлен ниже этого. Неважно, что вы начинаете, если таблица уже заполнена.

+0

Спасибо за это! Он не ответил напрямую на вопрос, как другие ответы, но это дало мне много понимания, чтобы понять, что происходит, и помогло мне понять, что я все время делал неправильный путь, и поэтому мой вопрос несколько вводил в заблуждение. – Jamie4840

+1

@ Jamie4840 Отвечать работать по назначению. :) – Schwern

2

Вы можете использовать таблицу с ключом AUTO_INCREMENT для эмуляции последовательностей:

CREATE TABLE ORDID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 622; 
CREATE TABLE PRODID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 200381; 
CREATE TABLE CUSTID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 109; 

Каждый из таблицы представляет собой «последовательность». Чтобы использовать один в вашем CREATE TABLE:

CREATE TABLE ITEM (
ORDID    INT NOT NULL, 
ITEMID    NUMERIC(4) NOT NULL, 
PRODID    NUMERIC(6), 
ACTUALPRICE   NUMERIC(8,2), 
QTY     NUMERIC(8), 
ITEMTOT    NUMERIC(8,2), 
CONSTRAINT ITEM_FOREIGN_KEY FOREIGN KEY (ORDID) REFERENCES ORDID (ID), 
CONSTRAINT ITEM_PRIMARY_KEY PRIMARY KEY (ORDID,ITEMID)); 

Вы можете использовать INSERT, чтобы получить новое значение из вашей «последовательности»:

INSERT INTO ordid VALUES (null); 
SELECT LAST_INSERT_ID(); 
+0

Спасибо за ответ. Не совсем уверен, почему вы используете CREATE TABLE в первом примере? То есть CREATE TABLE ORDID (id INT ...) Какова актуальность создания таблиц для элементов, которые должны быть столбцами в моей таблице ITEM? – Jamie4840

+1

Первые три таблицы - ваши «последовательности». MySQL не поддерживает последовательности, но ближайшая идиома - использовать таблицу с одним столбцом AUTO_INCREMENT. – vhu

+1

Эмулированные «последовательности» потребуют дополнительных запросов. Для каждой строки, которую вы хотите вставить, вы должны сначала вставить в соответствующую таблицу последовательностей и использовать LAST_INSERT_ID для первичного ключа. Если вы можете использовать AUTO_INCREMENT, вместо этого ваша база данных будет намного проще работать. – Schwern

2

Вы можете создать таблицу с поля AUTO_INCREMENT и установить его начальное стоимость.

create table myseq(
    my_id int auto_increment primary key 
) auto_increment=100; 

Или используйте ALTER TABLE, чтобы сбросить значение, когда вы хотите:

alter table myseq auto_increment = 100;