単純に 2 つのテーブルを使用しないのはなぜですか? S会員用とP会員用があります。ゼロで埋められた ID を使用できます。番号を一意にする必要がある場合、つまり S000001 と P000001 の両方を存在させたくない場合は、別のテーブルを使用して一意の ID を保存し、S テーブルと P テーブルでそれらを参照します。
何かのようなもの:
-- Table `ids`
CREATE TABLE IF NOT EXISTS `ids` (
`master_id` INT ZEROFILL NOT NULL AUTO_INCREMENT ,
`member_type` ENUM('S','P') NULL ,
PRIMARY KEY (`master_id`) )
ENGINE = InnoDB;
-- Table `s_type`
CREATE TABLE IF NOT EXISTS `s_type` (
`s_type_id` INT NOT NULL ,
`master_id` INT NULL ,
PRIMARY KEY (`s_type_id`) ,
INDEX `fk_s_type_1` (`s_type_id` ASC) ,
CONSTRAINT `fk_s_type_1`
FOREIGN KEY (`s_type_id` )
REFERENCES `ids` (`master_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- Table `s_type_copy1`
CREATE TABLE IF NOT EXISTS `s_type_copy1` (
`p_type_id` INT NOT NULL ,
`master_id` INT NULL ,
PRIMARY KEY (`p_type_id`) ,
INDEX `fk_s_type_copy1_1` (`p_type_id` ASC) ,
CONSTRAINT `fk_s_type_copy1_1`
FOREIGN KEY (`p_type_id` )
REFERENCES `ids` (`master_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
本当にシンプルにしたい場合は、「S」または「P」の列挙型 CHAR(1) と組み合わせて自動インクリメント ID を使用するだけです。表示する必要があるときにそれらを組み合わせるだけです。CHAR(1) 列を使用して、メンバーシップ タイプを判別できます。
メンバーシップ タイプをさらに追加する予定がない場合は、ブール値 (0 = 'S'、1 = 'P') として TINYINT を使用することもできます。
-- Table `ids`
CREATE TABLE IF NOT EXISTS `ids` (
`member_id` INT ZEROFILL NOT NULL AUTO_INCREMENT ,
`member_type` ENUM('S','P') NULL ,
PRIMARY KEY (`member_id`) )
ENGINE = InnoDB;
...また...
-- Table `ids`
CREATE TABLE IF NOT EXISTS `ids` (
`member_id` INT ZEROFILL NOT NULL AUTO_INCREMENT ,
`member_type` TINYINT ,
PRIMARY KEY (`member_id`) )
ENGINE = InnoDB;