0

次の表を参照してください。

Country Name             |  Country Code |  isStandardName
----------------------------------------------------------

United States            |  USA          |    false
----------------------------------------------------------
United States of America |  USA          |    True 
----------------------------------------------------------
Yankees                  |  USA          |   false

United States of America / United States など、国コードが似ている国 (この場合は USA) のように異なる名前が存在する状況がありますが、そのうちの 1 つが標準的な名前である可能性があります。この場合、最も簡単な解決策は、同様の国コードが isStandardName セクションで一度に 1 つのブール true のみを持つことができるという制約を適用することです。

言い換えれば、トリガー/制約によって一連の等しい countryCode 名に対して "CountryCode , 'true'" を一意にする方法は?

この制約を強制する方法について何か提案はありますか?

4

2 に答える 2

1

「isStandardName」列を削除することをお勧めします。表 standard_country を作成します。country と standard_country の関係を作成しました。左結合を使用してビューを作成し、新しい構造を使用するようにモデルを変更します。

例。

CREATE TABLE `country` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country` varchar(63) DEFAULT NULL,
  `code` char(3) DEFAULT NULL COMMENT 'ISO 3166-1 alpha-3',
  PRIMARY KEY (`id`),
  UNIQUE KEY `country` (`country`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `country` (`id`, `country`, `code`)
VALUES
    (1,'United States','USA'),
    (2,'United States of America','USA'),
    (3,'Yankees','USA');

CREATE TABLE `standard_country` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country_id` int(11) unsigned NOT NULL,
  `code` char(3) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `key` (`code`),
  KEY `country_id` (`country_id`),
  CONSTRAINT `standard_country_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `standard_country` (`id`, `country_id`, `code`)
VALUES
    (1,2,'USA');

create or replace view countries_view as
select country.id country_id 
, country
, country.code
, COALESCE( (standard_country.id > 0) , 0 ) isStandard
from `country`
left join `standard_country`
on country.id = standard_country.country_id

-- example result
select * from countries_view ;

country_id    country    code    isStandard
1    United States    USA    0
2    United States of America    USA    1
3    Yankees    USA    0
于 2013-04-05T11:53:37.693 に答える