INSERT IGNORE INTO는 삽입할 수 없는 구문이 있는 경우 오류를 뱉지 않고 그다음 라인의 쿼리를 계속 실행합니다. 한 번에 여러 INSERT 쿼리를 돌리는데, 그중 중복 키 값이 포함되어 있다면 전체 쿼리가 실행되지 못하고 중간에 에러가 발생하며 멈춥니다. 중간에 멈추지 않고 끝까지 실행시키고 싶으면 INSERT IGNORE INTO 구문을 활용할 수 있습니다. INSERT IGNORE INTO 구문 INSERT IGNORE INTO 테이블명 (컬럼) VALUES (값) 예시) id 컬럼이 기본키인 users 테이블이 있습니다. 여기에 테이터를 insert 하는 경우를 보겠습니다. 아래 쿼리처럼 id 값을 1로 넣으면 에러가 발생합니다. id 값 2를 넣어도 마찬가지입니다. INSERT IN..
하이디SQL을 통해 MYSQL 데이터베이스 또는 테이블 백업을 할 수 있습니다. CLI 환경 대비 UI로 볼 수 있기 때문에 좀 더 직관적으로 이해하고 진행할 수 있는 게 장점 같습니다. HeidiSQL 데이터베이스를 SQL 내보내기 test 데이터베이스 내 test_a, test_b 테이블이 존재합니다. 이 샘플 데이터로 해보겠습니다. 1. 데이터베이스 전체 SQL로 내보내기 백업하려는 데이터베이스 자체를 우클릭합니다. 이후 데이터베이스를 SQL로 내보내기를 선택합니다. 이때 데이터베이스, 테이블, 데이터에 대해 선택해야 합니다. 데이터베이스 삭제 : 해당 데이터베이스를 삭제하는 쿼리가 백업 쿼리에 포함됩니다. 데이터베이스 생성 : 삭제를 선택하면 생성은 자동 선택됩니다. 데이터베이스를 생성하는 쿼리가..
오라클 DB를 사용하는 기업에서 GUI 툴로 토드(TOAD)를 사용하는 경우를 종종 봅니다. toad 역시 하이디 SQL이나 SQL Server Management Studio처럼 데이터베이스를 편리하게 관리하게 해주는 그래픽 툴입니다. 1. TNS 방식 연결 토드의 경우 오라클 세션을 연결할 때 TNS 방식과 Direct 방식이 구분됩니다. 데이터베이스 접속을 위해서는 Host, Port, Service Name이 필요합니다. TNS 방식은 이러한 접속 정보를 별칭(Alias)과 함께 미리 오라클 클라이언트의 설정 파일인 TNSNames.ora 파일에 등록하고, 토드로 오라클에 접속할 땐 별칭만 입력해서 접속하는 방식입니다. 자주 연결해서 쓰는 경우 매번 번거롭게 접속 정보를 입력하지 않아도 돼서 편합..
데이터베이스에 데이터가 많이 쌓일수록 성능이 좋은 쿼리를 사용하는 게 중요합니다. 그렇지 않으면 데이터 출력이 늦어지고 그 과정에서 리소스를 과도하게 점유할 수 있습니다. 쿼리 성능이 좋지 않다고 판단되면 MYSQL에서는 EXPLAIN 문으로 분석해 볼 수 있습니다. MYSQL EXPLAIN 구문 EXPLAIN 사용법은 진단하려는 쿼리문 앞에 EXPLAIN을 붙이면 끝입니다. EXPLAIN 쿼리문 예를 들어 orders 테이블 전체를 select 하는 쿼리면 아래처럼 씁니다. EXPLAIN SELECT * FROM orders; explain을 사용하면 여러 결과값을 얻을 수 있습니다. 이 요소들을 보고 쿼리문 성능을 추정합니다. 결론적으로 이 결과값을 해석하는 것이 중요합니다. 컬럼명 설명 id 쿼리 ..
리눅스에서 MySQL 또는 MariaDB에 로그인했을 때 쿼리를 날리려고 하자 Ignoring query to other database라는 정체불명의 에러가 나타났습니다. MariaDB [(none)]> show databases; Ignoring query to other database Ignoring query to other database 이 문제에 대해 구글링을 하면 아주 단순한 원인과 해법을 찾을 수 있습니다. 대부분 비슷한 내용인데, 마음에 들지는 않는 결론입니다. 로그인할 때 오타를 냈다는 건데요. mysql -u root -p 이렇게 로그인 해야하는데 mysql -root -p 이렇게 u를 빼고 로그인했다는 겁니다. 확인해 보면 실제로 틀린 말은 아닙니다. mysql -root -p로..
MYSQL에서 사용자(user)를 생성하고 사용하는 건 은근히 복잡합니다. 생성하는 구문 자체는 어렵지 않습니다. 하지만 호스트 연결과 권한에 대한 개념이 존재하기 때문에 처음엔 이해가 되지 않을 수 있습니다. 사용자는 특정한 호스트에서만 연결될 수 있고, 특정 데이터베이스만 사용할 수도 있습니다. 심지어 데이터베이스 내에 있는 테이블 별로도 다르게 권한을 부여할 수 있습니다. 사용자의 호스트 연결과 권한 개념에 대해 정리해보겠습니다. MYSQL USER 1. 사용자 생성 사용자를 생성할 땐 계정명, 호스트, 비밀번호를 설정합니다. create user '계정명'@'호스트' identified by '비밀번호'; 1. localhost 연결에 대한 사용자 생성 예를 들어, localhost 연결에 대해 ..
용량이 큰 테이블을 쿼리하는 건 종종 위험합니다. 쿼리 성능이 받쳐주지 않는 환경에서 오랜 기간 쿼리가 끝나지 않고 이어지다 보면 리소스를 많이 잡아먹고, 최악의 경우 시스템이 다운될 가능성도 충분하기 때문입니다. 이를 방지하기 위해 쿼리가 너무 오래 지속된다 싶으면 즉각 중단시킬 필요가 있습니다. 실행 중인 쿼리 강제 중지 두 가지 명령을 사용합니다. 먼저 현재 실행 중인 쿼리를 찾는 명령입니다. SHOW PROCESSLIST; -- 또는 SHOW FULL PROCESSLIST; -- SHOW FULL PROCESSLIST는 더 자세한 정보를 보여줍니다. 여기서 확인되는 실행 쿼리와 해당 프로세스의 ID를 확인해서 KILL 시킵니다. KILL [쿼리 ID]; 예를 들어, 프로세스 ID가 3이면 다음과 ..
SQL Server (MSSQL)에서 테이블을 생성하면 테이블명 앞에 dbo. 라는 명칭이 자동으로 앞에 붙습니다. dbo는 database owner의 약자로 모든 데이터베이스의 기본적으로 포함되는 스키마 이름입니다. dbo란? 스키마는 데이터베이스에서 객체(테이블, 뷰 등)를 구성하고 관리하는 논리적인 컨테이너입니다. 즉, 스키마 밑으로 테이블이 있습니다. 예를 들어, dbo.table은 dbo 스키마 밑으로 만들어진 table이라는 이름의 테이블입니다. dbo 스키마는 SQL Server 데이터베이스에 기본적으로 포함되어 있습니다. 따로 스키마를 명시하지 않고 생성한 테이블은 dbo 스키마 아래에 위치합니다. 스키마가 다르면 같은 데이터베이스 내에서도 동일한 이름으로 테이블을 만들 수 있습니다. 예..
SQL Server(MSSQL)에서 데이터베이스, 로그인 추가를 할 때 중요한 건 권한의 범위를 설정하는 것입니다. 권한을 부여해야 생성한 로그인 계정으로 원하는 데이터베이스를 사용할 수 있습니다. MSSQL 데이터베이스 / 로그인 추가 1. 데이터베이스 추가 데이터베이스 폴더 우클릭 > 새 데이터베이스를 클릭합니다. 데이터베이스 이름을 설정하고 확인을 누르면 데이터베이스가 생성됩니다. 2. 로그인 추가 이제 해당 데이터베이스를 사용할 로그인 계정을 만들어보겠습니다. 보안 폴더 하위의 로그인 폴더를 우클릭 > 새 로그인을 클릭합니다. 좌측 상단의 페이지 선택의 일반에서는 로그인 이름과 암호를 설정합니다. 참고로 윈도우의 암호 복잡도를 충족하지 못하는 경우 오류 코드 15118가 발생합니다. 복잡도를 바꾸..
기본적으로 쿼리 옵티마이저는 SQL 문을 실행하면 최적의 실행 방법으로 쿼리를 실행해줍니다. 쉽게 말해 사용자가 대충 쿼리를 던져줘도 내부적으로는 똑똑하게 쿼리를 최적화해서 실행합니다. 그런데 테이블 힌트라는 것을 쓰면 쿼리 옵티마이저의 동작을 명시적으로 제어할 수 있습니다. 테이블 힌트 중 하나가 SQL Server에서 사용하는 WITH (NOLOCK) 입니다. MSSQL WITH (NOLOCK) 사용 구문 SELECT * FROM [테이블] WITH (NOLOCK) WHERE [조건] WITH (NOLOCK) 사용 이유 1. 테이블을 락(lock)하지 않아 쿼리 중에도 사용할 수 있다. WITH (NOLOCK)은 일반적으로 SELECT 쿼리에 사용되어 해당 쿼리가 공유 락을 얻지 않도록 합니다. 예를..