itsource

MySQL 여러 테이블에 삽입? (데이터베이스 정규화?)

mycopycode 2022. 11. 24. 20:48
반응형

MySQL 여러 테이블에 삽입? (데이터베이스 정규화?)

요.insert같은 쿼리에서 여러 테이블에 정보를 저장했는데 그게 불가능하다는 걸 알게 되었나요? 저는 ★★★★★★★★★★★★★★★★★★★★★★★.insert 여러 개의 질의)를 합니다.

INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')

어떻게 인크리먼트를 할 수요?id usersuserid★★★★★★★★★★★★★★★★의 경우profile 테이블? 테이블?

아니요, MySQL 명령 하나로 여러 테이블에 삽입할 수 없습니다.그러나 트랜잭션을 사용할 수 있습니다.

BEGIN;
INSERT INTO users (username, password)
  VALUES('test', 'test');
INSERT INTO profiles (userid, bio, homepage) 
  VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com');
COMMIT;

자동 증분 값을 재사용하는 방법을 확인하십시오.

"이렇게 많은 시간을 들여서 알아봤지만, 여전히 효과가 없어요. 방금 생성한 ID를 $var에 넣고 그 $var를 모든 MySQL 명령에 넣으면되나요?"

상세하게 설명하겠습니다.여기에는 3가지 방법이 있습니다.

  1. 위에 보이는 코드로.모두 MySQL과 MySQL에서 .LAST_INSERT_ID()자동 증가 컬럼을 사용합니다.

    두 문 가 자동 컬럼이 , " " "는 "를 의미합니다.LAST_INSERT_ID()는 표 11이 표됩니다.이후에도 표 1이 필요하시면 변수에 저장해야 합니다.: 2는 2와 3으로 이어집니다.

  2. 재고를 확보하다LAST_INSERT_ID()MySQL 변 :

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. 재고를 확보하다LAST_INSERT_ID() 변수할 수 의 경우: ( 이또데데또 that that that또 ) 。

    • INSERT ...
    • 하여 ""를 .LAST_INSERT_ID()의 MySQL을 하여 php를 실행합니다mysql_insert_id() 하면 .
    • INSERT [use your php variable here]

경고

어떤 방법으로 이 문제를 해결하든 쿼리 간에 실행이 중단될 경우(데이터베이스 서버 크래시 등) 어떻게 해야 하는지 결정해야 합니다.'끝난 사람도 있고 안 끝난 사람도 있다'고 느끼면서 살 수 있다면 읽지 마세요.

그러나 "모든 쿼리가 종료되거나 종료되지 않음 - 일부 테이블에는 행이 있지만 다른 테이블에는 일치하는 행이 없으며 데이터베이스 테이블은 항상 일관되게 유지됨"을 결정할 경우 트랜잭션에서 모든 문을 래핑해야 합니다.는 래서제 the the the that that that that that that that that that 。BEGIN그리고.COMMIT여기서.

저장 프로시저를 사용하는 경우 다음과 같이 매우 간단합니다.

call insert_user_and_profile('f00','http://www.f00.com');

전체 스크립트:

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null
)
engine=innodb;

drop table if exists user_profile;
create table user_profile
(
profile_id int unsigned not null auto_increment primary key,
user_id int unsigned not null,
homepage varchar(255) not null,
key (user_id)
)
engine=innodb;

drop procedure if exists insert_user_and_profile;

delimiter #

create procedure insert_user_and_profile
(
in p_username varchar(32),
in p_homepage varchar(255)
)
begin
declare v_user_id int unsigned default 0;

insert into users (username) values (p_username);
set v_user_id = last_insert_id(); -- save the newly created user_id

insert into user_profile (user_id, homepage) values (v_user_id, p_homepage);

end#

delimiter ;

call insert_user_and_profile('f00','http://www.f00.com');

select * from users;
select * from user_profile;

이러한 레코드를 많이 만들고 싶은 경우(1명이 아닌 10명의 사용자를 등록하는 경우) 어떻게 됩니까?다음 솔루션을 찾았습니다(5개의 쿼리만).

스텝 I: 새로운 데이터를 저장할 임시 테이블을 만듭니다.

CREATE TEMPORARY TABLE tmp (id bigint(20) NOT NULL, ...)...;

다음으로 이 표를 값으로 채웁니다.

INSERT INTO tmp (username, password, bio, homepage) VALUES $ALL_VAL

여기 대신$ALL_VAL값 목록 배치: ('test1', 'test1', 'bio1', 'home1', 'testn', 'testn', 'bion', 'homen')

스텝 II: 데이터를 '사용자' 테이블로 전송합니다.

INSERT IGNORE INTO users (username, password)
SELECT username, password FROM tmp;

여기서 일부 사용자가 이미 내부에 있는 것을 허용할 경우 "IGNORE"를 사용할 수 있습니다.임의로 이 스텝 전에 스텝 III와 같은 UPDATE를 사용하여 이미 내부에 있는 사용자를 검색할 수 있습니다(tmp 테이블에서 해당 사용자를 마킹).여기에서는, 그 유저명은 다음과 같이 선언됩니다.PRIMARY사용자 테이블에 있습니다.

스텝 III: 갱신을 적용하여 모든 사용자 ID를 사용자로부터 tmp 테이블로 읽습니다.이것은 중요한 단계입니다.

UPDATE tmp JOIN users ON tmp.username=users.username SET tmp.id=users.id

순서 IV: 사용자의 읽기 ID를 사용하여 다른 테이블 작성

INSERT INTO profiles (userid, bio, homepage) 
SELECT id, bio, homepage FROM tmp

mysql_insert_id()를 확인합니다.

다음 매뉴얼을 참조하십시오.http://in.php.net/manual/en/function.mysql-insert-id.php

이거 먹어봐

$sql= " INSERT INTO users (username, password) VALUES('test', 'test') ";
mysql_query($sql);
$user_id= mysql_insert_id();
if(!empty($user_id) {

$sql=INSERT INTO profiles (userid, bio, homepage) VALUES($user_id,'Hello world!', 'http://www.stackoverflow.com');
/* or 
 $sql=INSERT INTO profiles (userid, bio, homepage) VALUES(LAST_INSERT_ID(),'Hello   world!', 'http://www.stackoverflow.com'); */
 mysql_query($sql);
};

레퍼런스
PHP
MYSQL

네 말에 대해 한마디만 하자.

안녕하세요, 같은 쿼리의 여러 테이블에 정보를 삽입하는 방법을 검색하려고 했습니다.

점심 식사는 모두 한 그릇에 담아 드시나요?
내 생각엔... 아니다.

저도 마찬가지에요.
따로 하는 게 있어요.
2 삽입 쿼리는 2 삽입 쿼리입니다.괜찮아요.아무런 문제 없어.한 번에 으깨지 않아도 돼.
선택도 마찬가지입니다.쿼리는 합리적이고 그 기능을 수행해야 합니다.그게 유일한 이유야.쿼리 수가 없습니다.

한 번의 콜에 다른 쿼리를 삽입하는 방법을 찾는 것은 의미가 없습니다.다른 콜은 데이터베이스 API의 동작 방식입니다.

PDO의 경우 이 작업을 수행할 수 있습니다.

$dbh->beginTransaction();

$stmt1 = "INSERT INTO users (username, password) VALUES('test', 'test')"; 
$stmt2 = "INSERT INTO profiles (userid, bio, homepage) VALUES('LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com')";

$sth1 = $dbh->prepare($stmt1);
$sth2 = $dbh->prepare($stmt2);

$sth1->execute (array ('test','test'));
$sth2->execute (array ('Hello world!','http://www.stackoverflow.com'));

$dbh->commit();

언급URL : https://stackoverflow.com/questions/5178697/mysql-insert-into-multiple-tables-database-normalization

반응형