MySQL изменить составной первичный ключ, чтобы заменить

Насколько я знаю, NSData - это просто объект данных, который обертывает массив байтов:

https://developer.apple.com/library/mac/documentation/ Cocoa / Reference / Foundation / Classes / NSData_Class / Reference / Reference.html

... поэтому одним из способов, о котором я могу думать, если вы хотите открыть его тип MIME, является проверка самих байтов и затем предположим, что там есть. Вот пример этого здесь: Поиск типа изображения из NSData или UIImage

Я также нашел это: Определить тип MIME NSData, загруженный из файла ; который относится к некоторой внутренней базе данных (я думаю), которая может использоваться для поиска типа MIME.

Но, как говорит Том Харрингтон в своем ответе, это может стать сложным в зависимости от того, с чем вы имеете дело.

Изменить ...

Конечно, это второе решение зависит от расширения файла, которого у вас явно нет, но я уверен, что вы это уже заметили.

1
задан medley56 20 February 2019 в 21:29
поделиться

1 ответ

Воспроизведение ошибки:

mysql> create table dealers (dealer_id int primary key);
mysql> create table models (model_id int primary key);
mysql> create table my_table (dealer_id int, model_id int, model_year int, allocation_week int, primary key (dealer_id, model_id, model_year, allocation_week));

mysql> alter table my_table add foreign key (dealer_id) references dealers(dealer_id);

mysql> alter table my_table add foreign key (model_id) references models (model_id);

Теперь таблица выглядит следующим образом. Он неявно создал индекс для model_id, но не должен был делать это для dealer_id, потому что он был в состоянии «заимствовать» использование индекса PK для самого левого столбца.

mysql> show create table my_table\G

CREATE TABLE `my_table` (
  `dealer_id` int(11) NOT NULL DEFAULT '0',
  `model_id` int(11) NOT NULL DEFAULT '0',
  `model_year` int(11) NOT NULL DEFAULT '0',
  `allocation_week` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`dealer_id`,`model_id`,`model_year`,`allocation_week`),
  KEY `model_id` (`model_id`),
  CONSTRAINT `my_table_ibfk_1` FOREIGN KEY (`dealer_id`) REFERENCES `dealers` (`dealer_id`),
  CONSTRAINT `my_table_ibfk_2` FOREIGN KEY (`model_id`) REFERENCES `models` (`model_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Поэтому, когда я уронил PK, он не может этого сделать, потому что это сломало бы FK:

mysql> alter table my_table drop primary key;
ERROR 1025 (HY000): Error on rename of './test/#sql-337_18' to './test/my_table' (errno: 150 - Foreign key constraint is incorrectly formed)

Решение: добавьте вторичный индекс для dealer_id, тогда вы можете бросьте ПК.

Вы можете сделать все эти изменения в одном ALTER:

mysql> alter table my_table 
    add key (dealer_id), 
    drop primary key, 
    add column id int auto_increment primary key first;

Результат:

mysql> show create table my_table\G

CREATE TABLE `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dealer_id` int(11) NOT NULL DEFAULT '0',
  `model_id` int(11) NOT NULL DEFAULT '0',
  `model_year` int(11) NOT NULL DEFAULT '0',
  `allocation_week` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `model_id` (`model_id`),
  KEY `dealer_id` (`dealer_id`),
  CONSTRAINT `my_table_ibfk_1` FOREIGN KEY (`dealer_id`) REFERENCES `dealers` (`dealer_id`),
  CONSTRAINT `my_table_ibfk_2` FOREIGN KEY (`model_id`) REFERENCES `models` (`model_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
0
ответ дан Bill Karwin 20 February 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: