2016-09-06 4 views
-1

У меня есть эта таблицадобавляя уникальный к существующим внешним ключом

CREATE TABLE IF NOT EXISTS `transaction` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `amount` bigint(20) NOT NULL, 
    `req_id` int(11) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `transactions_873a2484` (`req_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=914 ; 

я хочу, чтобы изменить этот внешний ключ transactions_873a2484 к unque внешний ключ в основном я хочу, чтобы изменить его

UNIQUE KEY `transactions_req_id_de2b5683_uniq` (`req_id`), 

я уже есть много данных в моей таблице, иначе я бы просто переделал эту таблицу .... есть ли все равно, чтобы сделать это, нанося вред данным?

+0

- это уникальные данные? Сколько ссылочных таблиц у вас есть на это * ссылка * – Drew

+0

Вы могли бы сделать это из child-up (сначала для ребенка). http://stackoverflow.com/a/838412 – Drew

+0

Затем начните восстановление parent-down – Drew

ответ

1

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

create table t9 
(
    id int auto_increment primary key, 
    thing varchar(20) not null, 
    key(thing), 
    unique key (thing), 
    unique key `yet_another` (thing) 
); 
-- warning 1831 dupe index 
show create table t9; 
CREATE TABLE `t9` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `thing` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `thing_2` (`thing`), 
    UNIQUE KEY `yet_another` (`thing`), 
    KEY `thing` (`thing`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Так что смотрите на весь багаж это вы должны носить с upserts (читай: медленные дополнительные ненужные индексы).

Итак, если вы хотите, чтобы он был как можно более худым, как я уже упоминал в комментариях, сначала откройте вещи, отбросив FK в дочерних таблицах, , ссылаясь на. См. This Answer.

Затем удаляем текущий неуникальную родительский ключ:

DROP INDEX index_name ON tbl_name; 

Затем добавить уникальный ключ в родительском. Это новый ссылки:

CREATE UNIQUE INDEX idxName ON tbl_name (colName); 

Затем добавьте FK-й в положению детей (ссылки)

CREATE INDEX idxName ON child_tbl_name (colName); 

Вы можете получить имена ключей от show create table theTableName или от SHOW INDEX. Используйте новые имена для новых, это не имеет значения.

Такие, как:

mysql> show index from t9; 
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| t9 |   0 | PRIMARY  |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| t9 |   0 | thing_2  |   1 | thing  | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| t9 |   0 | yet_another |   1 | thing  | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| t9 |   1 | thing  |   1 | thing  | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
0
ALTER TABLE `transaction` 
    DROP INDEX `transactions_873a2484`, 
    ADD UNIQUE(req_id); 

Вы не можете превратить неоднозначный в UNIQUE, но выше, должны сделать эквивалент. Данные будут целыми и невредимыми.

Смежные вопросы