(출처 : http://jason-heo.github.io/mysql/2014/03/05/manage-dup-key2.html)


INSERT 시 중복 키 관리를 위한 방법에는 다음과 같이 3가지가 있다.

  1. INSERT IGNORE
  2. REPLACE INTO …
  3. INSERT INTO … ON DUPLICATE UPDATE

중복 키 관리는 본 책의 앞 부분에서 잠시 언급되었는데 각각의 특징을 좀 더 자세히 알아보도록 하자.

앞의 person 테이블을 다음과 같이 생성한 뒤에 테스트를 진행하였다.

CREATE TABLE person
(
  id INT NOT NULL AUTO_INCREMENT,
  academy_id INT,
  first_name VARCHAR(20),
  last_name VARCHAR(20),
  PRIMARY KEY (id),
  UNIQUE INDEX (first_name, last_name)
);

INSERT IGNORE

`INSERT IGNORE`는 중복 키 에러가 발생했을 때 신규로 입력되는 레코드를 무시하는 단순한 방법이다. 다음의 예를 보면 중복 키 에러가 발생했을 때 INSERT 구문 자체는 오류가 발생하지 않고, 대신'0 row affected'가 출력된 것을 볼 수 있다.

mysql> INSERT IGNORE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT IGNORE INTO person VALUES (NULL, 15, 'Cynthia', 'Smith');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT IGNORE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 0 rows affected (0.00 sec)
 
mysql> INSERT IGNORE INTO person VALUES (NULL, 15, 'Cynthia', 'Smith');
Query OK, 0 rows affected (0.00 sec)
 
mysql> INSERT IGNORE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 0 rows affected (0.00 sec)

당연히 SELECT의 결과는 2건만 존재한다.

mysql> SELECT * FROM person;
+----+------------+------------+-----------+
| id | academy_id | first_name | last_name |
+----+------------+------------+-----------+
|  1 |         15 | James      | Barkely   |
|  2 |         15 | Cynthia    | Smith     |
+----+------------+------------+-----------+
2 rows in set (0.00 sec)

AUTO_INCREMENT 컬럼의 값이 1, 2인 것에 주목하라

REPLACE INTO

"REPLACE INTO"는 "INSERT INTO" 구문에서 INSERT를 REPLACE로 바꾼 구문이다. 사용 방법은 "INSERT INTO"와 완벽히 동일하다.

mysql> REPLACE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 1 row affected (0.00 sec)
 
mysql> REPLACE INTO person VALUES (NULL, 15, 'Cynthia', 'Smith');
Query OK, 1 row affected (0.00 sec)
 
mysql> REPLACE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 2 rows affected (0.00 sec)
 
mysql> REPLACE INTO person VALUES (NULL, 15, 'Cynthia', 'Smith');
Query OK, 2 rows affected (0.00 sec)
 
mysql> REPLACE INTO person VALUES (NULL, 15, 'James', 'Barkely');
Query OK, 2 rows affected (0.00 sec)

REPLACE INTO의 결과는 INSERT IGNORE와 다르게 중복 키 오류 발생 시 ‘2 rows affected’가 출력되었다. SELECT 결과는 다음과 같다.

mysql> SELECT * FROM person;
+----+------------+------------+-----------+
| id | academy_id | first_name | last_name |
+----+------------+------------+-----------+
|  4 |         15 | Cynthia    | Smith     |
|  5 |         15 | James      | Barkely   |
+----+------------+------------+-----------+
2 rows in set (0.00 sec)

id가 4, 5로 변하였다. 이를 ‘2 rows affected’와 함께 종합적으로 판단한다면 “REPLACE INTO”는 중복 키 오류 발생 시 기존 레코드를 삭제하고 새로운 레코드를 입력한 것이다. 그래서 ‘2 rows affected’가 출력되었다. 1건은 DELETE, 1건은 INSERT로 보면 되고, 새로운 레코드가 입력되면서 AUTO_INCREMENT 컬럼의 값이 매번 새롭게 발급되었다.

AUTO_INCREMENT는 흔히 레코드를 식별할 수 있는 id로 사용되는데 이 값이 변경될 수 있으므로 “REPLACE INTO”는 그다지 좋은 방법이 아니다.

ON DUPLICATE UPDATE

ON DUPLICATE UPDATE는 중복 키 오류 발생 시 사용자가 원하는 값을 직접 설정할 수 있다는 장점이 있다. 우선 기본적인 사용 방법을 보자.

mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely')
    ->     ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
Query OK, 1 row affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'Cynthia', 'Smith')
    ->     ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
Query OK, 1 row affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely')
    ->     ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
Query OK, 0 rows affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'Cynthia', 'Smith')
    ->     ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
Query OK, 0 rows affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely')
    ->     ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
Query OK, 0 rows affected (0.00 sec)

INSERT 결과만 보면 “INSERT IGNORE”와 동일하다.

mysql> SELECT * FROM person;
+----+------------+------------+-----------+
| id | academy_id | first_name | last_name |
+----+------------+------------+-----------+
|  1 |         15 | James      | Barkely   |
|  2 |         15 | Cynthia    | Smith     |
+----+------------+------------+-----------+
2 rows in set (0.00 sec)

SELECT 결과를 보니, 중복 키 오류 발생 시 기존 레코드는 그대로 남아 있는 것 같다. 즉, id 값이 변경되지 않았다. 그렇다면 “ON DUPLICATE UPDATE”는 “INSERT IGNORE” 대비 장점은 없을까?아니다. 복잡하고 어려운 대신에 중복 키 오류 발생 시 사용자가 원하는 행동을 지정할 수 있다는 장점이 있다. 예를 위해 person 테이블 구조를 다음과 같이 변경했다.

CREATE TABLE person
(
  id INT NOT NULL AUTO_INCREMENT,
  academy_id INT,
  first_name VARCHAR(20),
  last_name VARCHAR(20),
  insert_cnt INT,
  PRIMARY KEY (id),
  UNIQUE INDEX (first_name, last_name)
);

그런 뒤 다음과 같은 INSERT 구문을 실행하였다.

mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely', 1)
    ->     ON DUPLICATE KEY UPDATE insert_cnt = insert_cnt + 1;
Query OK, 1 row affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'Cynthia', 'Smith', 1)
    ->     ON DUPLICATE KEY UPDATE insert_cnt = insert_cnt + 1;
Query OK, 1 row affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely', 1)
    ->     ON DUPLICATE KEY UPDATE insert_cnt = insert_cnt + 1;
Query OK, 2 rows affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'Cynthia', 'Smith', 1)
    ->     ON DUPLICATE KEY UPDATE insert_cnt = insert_cnt + 1;
Query OK, 2 rows affected (0.00 sec)
 
mysql>
mysql> INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely', 1)
    ->     ON DUPLICATE KEY UPDATE insert_cnt = insert_cnt + 1;

Query OK, 2 rows affected (0.00 sec) SELECT를 해 보면 insert_cnt에는 해당 중복 값이 몇 번 INSERT 시도가 되었는지 기록되어 있을 것이다.

mysql> SELECT * FROM person;
+----+------------+------------+-----------+------------+
| id | academy_id | first_name | last_name | insert_cnt |
+----+------------+------------+-----------+------------+
|  1 |         15 | James      | Barkely   |          3 |
|  2 |         15 | Cynthia    | Smith     |          2 |
+----+------------+------------+-----------+------------+
2 rows in set (0.00 sec)

이 외에도 다양한 용도로 활용될 수 있다.

주의해야 할 점은 INSERT 구문에 주어진 값으로 UPDATE하고자 할 때는 항상 “VALUES(column)”과 같이 VALUES()로 감싸야 한다는 점이다. 만약 다음과 같이 VALUES() 없이 사용한다면 기존에존재하는 레코드의 컬럼 값을 의미하게 된다.

INSERT INTO person VALUES (NULL, 15, 'James', 'Barkely')
    ON DUPLICATE KEY UPDATE academy_id = academy_id;

앞과 같이 사용했을 때, 기존 person 테이블에 존재하는 ‘James Barkely’의 academy_id가 13이었다면, INSERT 후에도 academy_id는 여전히 13이다.

요약

  • INSERT IGNORE
  • REPLACE INTO …
  • INSERT INTO … ON DUPLICATE UPDATE
분류특징
INSERT IGNORE기존 레코드가 남아 있음
기존 레코드의 AUTO_INCREMENT 값은 변하지 않음
REPLACE INTO기존 레코드가 삭제되고, 신규 레코드가 INSERT됨
따라서 AUTO_INCREMENT의 값이 변경됨
ON DUPLICATE UPDATEINSERT IGNORE의 장점 포함함
중복 키 오류 발생 시, 사용자가 UPDATE될 값을 지정할 수 있음


'sql' 카테고리의 다른 글

table auto increment 초기화 방법  (0) 2017.02.15
toad for mysql table 에서 record 한글이 깨질때 해결방법  (0) 2017.02.03
dynamic qyery  (0) 2017.02.03
sql join 사용방법  (0) 2017.01.20
sql query 모음  (0) 2017.01.18

1. db 에서 특정 record를 삭제하려고 할때 "키 열 정보를 반환하지 않는 SelectCommand에 대해서는     UpdateCommand에 대한 동적 SQL 생성이 지원되지 않습니다 " 라는 오류 메세지가 나오면서 record     삭제가 거부될때 해결방법

 

 - 원인은 columns 에 primary key 가 설정 되어 있지 않아서 발생함

 - 해결방법 : 생성된 columns 중에 primary key를 설정함


alter table [테이블명] add primary key(column);


2. primary key 삭제 방법

alter table [테이블명] drop primary key;    

3. table record 삭제 방법

delete from [테이블명] where 조건;

4. unique key 설정 방법

alter table [테이블명] add UNIQUE INDEX(phone);

5. unique key 삭제 방법

alter table [테이블명] drop index email;
6. like 검색
SELECT [칼럼명] FROM [테이블명] WHERE [칼럼명] LIKE '%특정문자열%;   

7. Column 추가 

alter TABLE [테이블명]ADD COLUMN [컬럼이름] [컬럼타입]

8. Column 삭제

alter TABLE [테이블명] Drop COLUMN [컬럼이름]

9. Column 수정

alter TABLE [테이블명] Modify  [컬럼이름] [컬럼타입]

10. Update

update TABLE [테이블명] SET COLUMN [컬럼이름]=data where ~~

11. Column 순서 변경

alter TABLE [테이블명] MODIFY COLUMN [컬럼이름] [컬럼타입] FIRST

12. Column Index 자동 증가 설정

alter TABLE uanb_worker_event modify column idx int(2)  NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

'sql' 카테고리의 다른 글

table auto increment 초기화 방법  (0) 2017.02.15
toad for mysql table 에서 record 한글이 깨질때 해결방법  (0) 2017.02.03
dynamic qyery  (0) 2017.02.03
sql join 사용방법  (0) 2017.01.20
중복키 관리방법  (0) 2017.01.18

 mybatis를 사용할때 xml에 query를 작성하여 요청하려면 설정이 필요한다. 이것은 mapper와 연결된다. 


@Bean 

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource firstDataSource() { return DataSourceBuilder.create().build(); }


@Bean

public SqlSessionFactory firstSqlSessionFactory(DataSource firstDataSource, ApplicationContext applicationContext) throws Exception { 

SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 

sqlSessionFactoryBean.setDataSource(firstDataSource); 


sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/*mapper.xml")); 

return sqlSessionFactoryBean.getObject(); 

}


여기서 classpath:mapper/*mapper.xml 부분에 xxx_mapper.xml 파일을 모두 위치 시킨다.자동으로 resource 폴더에서 mapper prefix가 붙은 mapper xml파일을 인식한다.

'spring boot' 카테고리의 다른 글

requestMapping result 한글이 깨지는 문제 해결방법  (0) 2017.04.19
jar file 만들기  (0) 2017.02.21
@POST 가 안될때 해결방법  (2) 2017.01.10
log4j 설정법  (0) 2017.01.10

 spring boot 에 mariadb 를 설정하려면 몇가지 설정을 해줘야 한다. 


1. pom.xml


   <dependency>

   <groupId>org.mariadb.jdbc</groupId>

   <artifactId>mariadb-java-client</artifactId>

   <version>1.1.9</version>

</dependency>


2. application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

spring.datasource.url=jdbc:mariadb://localhost:port/db_name

spring.datasource.username=아이디

spring.datasource.password=패스워드





'mariadb & mysql' 카테고리의 다른 글

mysql 환경설정 파일 위치  (0) 2017.06.20
mysql 설치방법  (0) 2017.06.19
mariadb 원격 접속 설정  (0) 2017.02.24
database character set 확인하기  (0) 2017.02.03
mariadb 설치  (0) 2017.01.09

1. @RequestMethos.POST 설정을 했는데 Request method 'GET' not supported 오류가 발생한다면 GET 과 POST를 동시에 설정하면 면 오류가 발생하지 않는다.


@RequestMapping(method =  {RequestMethod.GET, RequestMethod.POST}

  

'spring boot' 카테고리의 다른 글

requestMapping result 한글이 깨지는 문제 해결방법  (0) 2017.04.19
jar file 만들기  (0) 2017.02.21
mybatis mapper 설정  (0) 2017.01.17
log4j 설정법  (0) 2017.01.10

1. Logger 사용하기위해 log4j 를 사용한다.

2. log4j 를 사용하기 위해 설정을 해야 하는데. pom.xml & application.properties 에 설정한다


- pom.xml

   

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.0-beta6</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.0-beta6</version>

</dependency>



- application.properties


log4j.rootLogger=INFO, console, logfile


log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%-5p %l - %m%n



log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logfile.File=${catalina.home}/logs/changpd.log

log4j.appender.logfile.DatePattern='.'yyyy-MM-dd

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n



log4j.logger.com.changpd=DEBUG, console

log4j.logger.com.changpd.Test=INFO, logfile



3. logger 확인방법(예제)


@RestController

test.java



private static final Logger logger = Logger.getLogger(test.class);


logger.info("test log !!!!!!");




'spring boot' 카테고리의 다른 글

requestMapping result 한글이 깨지는 문제 해결방법  (0) 2017.04.19
jar file 만들기  (0) 2017.02.21
mybatis mapper 설정  (0) 2017.01.17
@POST 가 안될때 해결방법  (2) 2017.01.10

Ubuntu 14.04 에 MariaDB 10의 설치 방법



$sudo apt-get install python-software-properties 
$sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
$sudo add-apt-repository 'deb http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu lucid main'
$sudo apt-get update
$sudo apt-get install mariadb-server


- add-apt-repository 이 없는경우 
$add-apt-repository 입력후 설치되지 않은 패키지 확인됨, apt-get으로 설치되지 않은 패키지를 설치함



maria db 실행
$ mysql -u root -p


'mariadb & mysql' 카테고리의 다른 글

mysql 환경설정 파일 위치  (0) 2017.06.20
mysql 설치방법  (0) 2017.06.19
mariadb 원격 접속 설정  (0) 2017.02.24
database character set 확인하기  (0) 2017.02.03
spring boot 에 설정방법  (0) 2017.01.12


우분투를 설치하고 한글이 깨져서 보이는 현상이 있을때 아래 명령으로 한글을 깨지는문제를 해결할수 있음


우분투버전 : 14.04



$sudo apt-get install fbterm

$sudo apt-get install fonts-nanum-coding

$sudo fbterm

'ubuntu' 카테고리의 다른 글

호스트 이름 변경방법  (0) 2017.06.19
ssh 설정  (0) 2017.06.19
vi로 파일에 기록된 내용이 저장되지 않을때 조치방법  (0) 2017.06.07
vi editor 사용법 2  (0) 2017.06.07
vi 사용법  (0) 2017.02.03

1. gilab은 디폴트로 소스코드 push 를 관리자 이외에는 할수 없도록 설정 되어 있다. 그래서 또다른 사용자가 소스를 push 하려면 관리자가 push 권한을 허가 해야 한다.아래는 설정>Protected Branshes 에서  push 권한을 설정할수 있는 부분이다.



'gitlab' 카테고리의 다른 글

gitlab 등록  (0) 2017.01.03

1. source tree 를 사용하여 협업을 하려면 함께 개발하고 있는 프로젝트를 공유해야 한다. 자신이 개발한 프로젝트를 gitlab에 올리거나 다른사람이 개발한 소스코드를 자신의 pc에 가져오거나 업데이트를 해야 한다. svn을 사용해본 사용자라면 commit, check out 의 개념을 알고 있을것이다. source tree는 이보다 좀더 확장된 개념을 가지고 있는데 몇가지 기본 개념을 이해하면 source tree를 이용하여 gitlab에 소스코드를 올리거나 다운을 받는 일을 쉽게 할수 있다.

 1) stage

  - source tree는 state라는 개념이 있다. 중간단계 정도라고 이해하면 좋겟다. 사용자의 pc에서 개발된 소스코드를 gitlab 원격 저장소에 등록하기전에 가상의 공간을 거쳐 간다 정도로 생각하면 이해하기 쉬울것이다. 그래서 아래그림을 보면 개발완료된 소스를 버튼(Stage All)하나로 stage에 올릴수 있다.



2) commit

- svn 을 사용해본 사용자라면 잘알고 있을것이다. 개념은 동일한데 svn은 commit 을 하면 서버에 저장이 되는데, source tree에서 commit은 업로드 완료가 아니다. 변경이력을 기록해 둔다 정도로 이해하는게 좋을꺼 같다. 내가 개발한내용이 이전코드에서 추가/수정된 부분이 어느부분이고 변경 시간을 언제인지같은 이력이 기록된다.



3) push

- 내 pc에서 변경된 내용을 gitlab 원격저장소에 올리는 기능이다. 푸쉬를 클릭하면 commit 된 소스코드를 최종적으로 원격저장소에 올릴수 있는데 push 위에 표시되는 숫자는 Commit 된 수이며 이때가 원격저장소에 올릴소스가 있다는 의미로 이해하면된다.




2. 소스코드 업데이트

 소스코드에 변경이 생기면 pull 아이콘위에 숫자가 표시된다.이때 pull 을 클릭하면 자신의 pc에 최신 소스코드를 업데이트 할수있다. pull 위에 표시되는 숫자는 Commit 된 수이며 이때가 업데이트 받을 소스가 있다는 의미로 이해하면된다.






'source tree' 카테고리의 다른 글

source tree 설치 & 저장소 생성하기  (0) 2017.01.04

+ Recent posts