Что “лучший” путь состоит в том, чтобы сохранить международные адреса в базе данных?

Если у вас есть дубликаты в вашей таблице, и вы используете

ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

, запрос завершится с ошибкой 1062 (дубликат ключа).

Но если вы используете IGNORE

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

дубликаты будут удалены. Но в документации не указывается, какая строка будет сохранена:

  • IGNORE - расширение MySQL для стандартного SQL. Он контролирует работу ALTER TABLE, если в уникальной клавише в новой таблице есть дубликаты, или если предупреждения включены, когда включен строгий режим. Если IGNORE не указывается, копия прерывается и откатывается, если возникают ошибки с повторяющимися ключами. Если указано IGNORE, для строк с дубликатами на уникальном ключе используется только одна строка. Остальные конфликтующие строки удаляются. Неверные значения усекаются до ближайшего подходящего допустимого значения. Начиная с MySQL 5.7.4, предложение IGNORE для ALTER TABLE удаляется, и его использование вызывает ошибку.
blockquote>

( ALTER TABLE Синтаксис )

Если ваша версия 5.7.4 или выше - вы можете:

  • Скопировать данные во временную таблицу (это необязательно должно быть временным техническим).
  • Усечь исходную таблицу.
  • Создайте УНИКАЛЬНЫЙ ИНДЕКС.
  • И скопируйте данные с помощью INSERT IGNORE (который все еще доступен).
CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;

Если вы используете модификатор IGNORE, ошибки, возникающие при выполнении инструкции INSERT, игнорируются. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка отбрасывается и ошибки не возникает. Игнорируемые ошибки генерируют предупреждения.

blockquote>

(Синтаксис INSERT)

Также см .: INSERT ... SELECT Синтаксис и Сравнение ключевого слова IGNORE и строгого режима SQL

40
задан animuson 24 October 2013 в 03:33
поделиться

5 ответов

Простой текст свободной формы.

Проверка всего сообщения/почтовых индексов в мире слишком трудна; фиксированный список стран слишком политически неоднозначен; обязательное state/region/other административное подразделение является просто несоответствующим (слишком часто, меня спрашивают, какое графство я живу в - когда я не делаю, потому что Большой Лондон не является графством вообще).

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

исключение к этому - то, при выполнении чего-то, что это естественно ограничивается в одну страну так или иначе. В этой ситуации необходимо попросить, скажем, {почтовый индекс, номер дома} пара, которой является достаточно для идентификации почтового адреса. Я предполагаю, что Вы могли достигнуть подобных вещей с расширенным почтовым индексом в США.

25
ответ дан DrPizza 27 November 2019 в 01:54
поделиться

В прошлом я смоделировал формы, которые должны были быть международными после форм адреса поставки взлетов/FedEx на их веб-сайтах (я фигурировал, не знают ли они, как обработать международный порядок, мы все политы из шланга). Поля, которые они используют, могут использоваться в качестве ссылки для установки Вашей схемы.

9
ответ дан The Brawny Man 27 November 2019 в 01:54
поделиться

В целом необходимо понять, почему Вы хотите адрес. Это для поставки/отправки по почте? Тогда существует действительно только одно требование, имейте отдельную страну. Другие строки являются свободной формой, чтобы быть заполненными в пользователем. Причиной этого является общая передающая стратегия почты: любая входящая почта для иностранного государства пересылается, не смотря на другие строки адреса. Следовательно, подробная информация анализируется только почтовым сортировщиком, расположенным в самой стране. Как получатель, они будут знакомы с национальными соглашениями.

(UPS может сгруппировать вместе некоторые небольшие европейские страны, e.. все Низкие Страны, вероятно, обслуживаются из Бельгии - идея все еще содержит.)

5
ответ дан MSalters 27 November 2019 в 01:54
поделиться

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

Самый Простой был бы

Address_Line_01 (Требуется, Не пробел) Значительный Город Address_Line_02 Address_Line_03 (Необходимый) Контакт (Необходимая) (Необходимая) Страна состояния Province_District (Требуемая)

, Все вышеупомянутое может быть текстом/Unicode с соответствующими длинами поля.

Номера телефона как применимые.

-3
ответ дан Abhinav 27 November 2019 в 01:54
поделиться

Думаю, можно добавить текст страны / города и адреса. Страна и город должны быть отдельными для отчетности. Менеджеры всегда запрашивают такие отчеты, которых вы не ожидаете, и я не предпочитаю запускать LIKE-запрос через большую базу данных.

2
ответ дан 27 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

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