2016-08-08 19 views
0

を登録しようか!INSERTは、どのように私は<code>t1_has_t2.data</code>を追加または更新しない、<code>t.id</code>、<code>a.id</code>、<code>t1.name</code>と<code>t2.name</code>考える

現在レコードがある場合は更新できます。

UPDATE t1_has_t2 
INNER JOIN t1 ON t1.id=t1_has_t2.t1_id 
INNER JOIN t2 ON t2.id=t1_has_t2.t2_id 
SET t1_has_t2.data=123 
WHERE t1.name="foo" AND t1.t_id=333 AND t2.name="bar" AND t2.t_id=333; 

現在レコードが存在しない場合はどうすれば挿入できますか?

EDIT。それは次のようなものでしょうか? JOINにtを含めることは無駄です。

INSERT INTO t1_has_t2(t1_id,t2_id,data) 
SELECT t1.id, t2.id, 123 
FROM t 
INNER JOIN t1 ON t1.t_id=t.id 
INNER JOIN t2 ON t2.t_id=t.id 
WHERE t1.name="foo" AND t1.t_id=333 AND t2.name="bar" AND t2.t_id=333 
ON DUPLICATE KEY SET t1_has_t2.data=123; 

EDIT2。ああ、多分私は今それを得る。私はt1とt2を共有t.idでお互いに参加していますか?

INSERT INTO t1_has_t2(t1_id,t2_id,data) 
SELECT t1.id, t2.id, 123 
FROM t1 
INNER JOIN t2 ON t2.t_id=t1.t_id 
WHERE t1.name="foo" AND t1.t_id=333 AND t2.name="bar" AND t2.t_id=333 
ON DUPLICATE KEY UPDATE t1_has_t2.data=123; 

enter image description here

-- MySQL Script generated by MySQL Workbench 
-- 08/08/16 07:40:04 
-- Model: New Model Version: 1.0 
SET @OLD_UNIQUE_CHEC[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

-- ----------------------------------------------------- 
-- Schema mydb 
-- ----------------------------------------------------- 
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `mydb` ; 

-- ----------------------------------------------------- 
-- Table `mydb`.`accounts` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`accounts` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`t` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`t` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `accounts_id` INT NOT NULL, 
    PRIMARY KEY (`id`, `accounts_id`), 
    INDEX `fk_t_accounts_idx` (`accounts_id` ASC), 
    CONSTRAINT `fk_t_accounts` 
    FOREIGN KEY (`accounts_id`) 
    REFERENCES `mydb`.`accounts` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`t1` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`t1` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `t_id` INT NOT NULL, 
    `t_accounts_id` INT NOT NULL, 
    `name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`), 
    INDEX `fk_t1_t1_idx` (`t_id` ASC, `t_accounts_id` ASC), 
    UNIQUE INDEX `un1` (`t_id` ASC, `name` ASC), 
    CONSTRAINT `fk_t1_t1` 
    FOREIGN KEY (`t_id` , `t_accounts_id`) 
    REFERENCES `mydb`.`t` (`id` , `accounts_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`t2` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`t2` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `t_id` INT NOT NULL, 
    `t_accounts_id` INT NOT NULL, 
    `name` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`), 
    INDEX `fk_t2_t1_idx` (`t_id` ASC, `t_accounts_id` ASC), 
    UNIQUE INDEX `un2` (`t_id` ASC, `name` ASC), 
    CONSTRAINT `fk_t2_t1` 
    FOREIGN KEY (`t_id` , `t_accounts_id`) 
    REFERENCES `mydb`.`t` (`id` , `accounts_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `mydb`.`t1_has_t2` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`t1_has_t2` (
    `t1_id` INT NOT NULL, 
    `t2_id` INT NOT NULL, 
    `data` VARCHAR(45) NULL, 
    PRIMARY KEY (`t1_id`, `t2_id`), 
    INDEX `fk_t1_has_t2_t21_idx` (`t2_id` ASC), 
    INDEX `fk_t1_has_t2_t11_idx` (`t1_id` ASC), 
    CONSTRAINT `fk_t1_has_t2_t11` 
    FOREIGN KEY (`t1_id`) 
    REFERENCES `mydb`.`t1` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_t1_has_t2_t21` 
    FOREIGN KEY (`t2_id`) 
    REFERENCES `mydb`.`t2` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 
+0

これはDB管理者のストリームhttp://dba.stackexchange.com/ – alsobubbly

+0

@alsobubblyでお尋ねすることをお勧めします。どちらのサイトも適切だと思われます。 – user1032531

+0

問題はありませんが、あなたのIODKUクエリーには – alsobubbly

答えて

0

私はあなたがInsert on Duplicate Key Update(IODKU)と欲しいものを理解していれば正常に動作します。

データロード:

insert accounts(id) values (NULL); -- id = 1 
insert t(accounts_id) values (1); -- id = 1 

insert t1(t_id,t_accounts_id,name) values (1,1,'n1'); -- id=1 
insert t1(t_id,t_accounts_id,name) values (1,1,'n2'); -- id=2 
insert t2(t_id,t_accounts_id,name) values (1,1,'n1'); -- id=1 
insert t2(t_id,t_accounts_id,name) values (1,1,'n2'); -- id=2 

insert t1_has_t2(t1_id,t2_id,data) values(1,1,'one_one'); -- success 
insert t1_has_t2(t1_id,t2_id,data) values(1,77,'x'); -- Error 1452 as expected 
insert t1_has_t2(t1_id,t2_id,data) values(77,1,'x'); -- Error 1452 as expected 
insert t1_has_t2(t1_id,t2_id,data) values(1,2,'one_two'); -- success 
insert t1_has_t2(t1_id,t2_id,data) values(2,1,'two_one'); -- success 
insert t1_has_t2(t1_id,t2_id,data) values(2,2,'two_two'); -- success 

あなたのクエリ:

UPDATE t1_has_t2 
INNER JOIN t1 ON t1.id=t1_has_t2.t1_id 
INNER JOIN t2 ON t2.id=t1_has_t2.t2_id 
SET t1_has_t2.data='I am a string' 
WHERE t1.name="n1" AND t1.t_id=1 AND t2.name="n1" AND t2.t_id=1; 

IODKU:

insert t1_has_t2(t1_id,t2_id,data) values(2,2,'two_two_version002') 
on duplicate key update data='anchovies'; 

を参照してください。結果:

select * from t1_has_t2; 
+-------+-------+---------------+ 
| t1_id | t2_id | data   | 
+-------+-------+---------------+ 
|  1 |  1 | I am a string | 
|  1 |  2 | one_two  | 
|  2 |  1 | two_one  | 
|  2 |  2 | anchovies  | 
+-------+-------+---------------+ 

insert ignore t1_has_t2(t1_id,t2_id,data) [something]; 

これは、設計によって自動的に成功または失敗するものです。

+0

がありますが、ここで質問するのは害ではありませんが、私はそうではない以前のクエリを実行しない限り、t1_idとt2_idの値はありませんやりたい – user1032531

+0

あなたが挿入したいものと何を更新するか(どのような条件に基づいて)をマッピングするのはどうですか?あなたは確かに1行を入れたいと言っているのでなければ、INSERT側ではそれをしていませんか? – Drew

+0

EDIT2のクエリが機能すると思います。 't.id'が333、' t1.name'が 'foo '、' t2.name'が 'bar'であれば、' t1_has_t2'に 'data'が123で、他のレコードの主キーこれらの2つの主キーに対してすでに存在する場合にのみ 'data'を更新します。 – user1032531

関連する問題