SQL/RDBMS 14

[MariaDB] 외래키 생성/삭제 방법

1. foreign key 추가1-1. 테이블과 동시에 생성 예제이름 자동 생성CREATE TABLE comments( comment_id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, post_id INT NOT NULL, -- ... FOREIGN KEY(post_id) REFERENCES post(post_id)) 1-2. 테이블이 이미 있을 때 외래키 추가 예제ALTER TABLE commentsADD CONSTRAINT fk_post_idFOREIGN KEY (post_id) REFERENCES posts(post_id)ON DELETE CASCADE; 1-3. 외래키 삭제 옵션외래키 추가시 삭제 옵션을 지정할 수 있다.- ON DELETE CASCADE부..

SQL/RDBMS 2024.11.30

쿼리 실행 속도 확인

1. SQL 실행 계획 확인MySQL에서는 `EXPLAIN` 키워드를 사용하여 쿼리의 실행 계획을 확인할 수 있습니다. 이 명령은 쿼리가 실행될 때 데이터베이스가 어떤 인덱스를 사용하고, 각 단계에서 얼마나 많은 행을 처리할지를 보여줍니다.EXPLAIN {QUERY};이 명령을 실행하면, 테이블 스캔 방식, 사용된 인덱스, 처리된 행 수 등의 정보를 포함한 실행 계획이 출력됩니다.2. 실제 실행 시간 측정쿼리의 실제 실행 시간을 측정하려면, SQL 콘솔 또는 프로그래밍 언어에서 직접 쿼리를 실행하고 SHOW PROFILE를 사용하여 시간을 측정할 수 있습니다.SET profiling = 1; -- 프로파일링 활성화-- 쿼리 실행{QUERY};SHOW PROFILES; -- 모든 실행된 쿼리의 프로파일..

SQL/RDBMS 2024.05.30

서브 쿼리 ORDER BY

문제 ORDER BY에서 ORA-00907: 누락된 우괄호라는 에러가 발생!! 검색 결과 아래와 같은 글을 찾았습니다. 서브쿼리에서는 ORDER BY 를 사용하지 못한다. ORDER BY는 SELECT 절에서 오직 한 개만 올 수 있기 때문에 메인쿼리 마지막 문장에 위치해야 한다. 그런데 LIMIT 1과 함께 사용해도 여전히 에러가 발생했습니다. 수정 방법 예시) - 테이블 생성 -- Table: Students CREATE TABLE Students ( StudentID INT PRIMARY KEY, StudentName VARCHAR(50) ); -- Table: Grades CREATE TABLE Grades ( GradeID INT PRIMARY KEY, StudentID INT, ExamDate..

SQL/RDBMS 2023.10.23

[MariaDB] RECURSIVE 계층 메뉴 구성

- 목적 MENU 테이블에 저장되어 있는 메뉴를 MENULEVEL과 PARENTMENUID를 이용하여 순서대로 들고온다. - 문제 현재 4단계 계층만 표현 -> 단계제약을 없애고 싶음. MENUID와 PARENTMENUID가 같을 때 무한루프 CONCAT이 잘림 WITH RECURSIVE CTE AS ( SELECT PROJECTID, MENUID, MENUTYPE, PARENTMENUID, MENULEVEL, POSITION, POSITION AS X FROM MENU WHERE PARENTMENUID = 'root' AND PROJECTID = #{projectId} UNION ALL SELECT B.PROJECTID, B.MENUID, B.PARENTMENUID, B.MENULEVEL, B.POSI..

SQL/RDBMS 2023.08.14

[MariaDB] 중복 파일명 처리(이름 뒤에 seq 붙이기)

가장 간단하게는 파일명이 중복되지 않을 때 까지 반복문을 사용하여 확인 할 수 있다. 예시 코드입니다. //java String orgName = fileObj.getFileName(); String newName = NewNameService.getNewName(fileObj); int idx = 1; while(newName != null){ fileObj.setFileName(orgName + "(" + (idx+1).toString() + ")"); newName = NewNameService.getNewName(fileObj); } 하지만 저는 아래와 같은 생각 때문에 쿼리한번으로 처리 하고자 했습니다. 1. 성능: 반복문을 사용하는 경우: 각각의 fileName를 가져와서 (idx)를 붙여서 ..

SQL/RDBMS 2023.07.03

[MariaDB] 환경 구축 (생성, 삭제, 권한, 백업)

1. DATABASE 생성 1-1.Window Menu – MySql Client 진입. 1-2.DB 변경 >> USE MYSQL - MariaDB [(none)] 에서 MariaDB [(mysql)] 로 변경 됩니다. 1-3.DATABASE 생성 >> CREATE DATABASE [DATABASE명]; 1-4.DATABASE 조회 >> SHOW DATABASES - 앞에서 생성한 DATABASE 확인할 수 있습니다. 2. 계정 생성 2-1. 계정 생성 >> CREATE USER ‘[USER_NAME]‘@’[호스트]’ IDENTIFIED BY ‘[PASSWORD]’; - 입력한 USER 명으로 새로운 USER 가 생성됩니다. * 호스트에 ‘%’ 는 모든 이라는 의미이다. 2-2. 사용자 계정 조회 >> ..

SQL/RDBMS 2023.04.25

ORA-01722: 수치가 부적합합니다

해당 에러를 검색했을 때 대부분 글에서 데이터 타입이 일치하지 않는 데이터를 넣을 때 발생하는 에러라고 나옵니다. 예를 들어, NUMBER타입의 컬럼에 문자를 집어 넣었을 경우 입니다. 하지만 저의 경우에는 다른 문제가 있었습니다. 테이블의 제약 조건을 조회 해보니 데이터타입이 FLOAT인 칼럼의 제약조건이 아래와 같이 설정되어 있었습니다. COL1 IN ('1~9') NUMBER형태의 데이터 타입의 범위를 설정할 때에는 아래와 같이 설정해야합니다. COL1 BETWEEN 1 AND 9

SQL/RDBMS 2023.03.17

[mariaDB] 제약 조건(조회, 추가, 수정, 삭제)

조회 SELECT * from information_schema.table_constraints FROM TABLE_NAME = '{테이블명}' *위 쿼리를 실행했을 때 결과 그런데 이렇게 실행하면 모든 TYPE의 제약조건이 나오지만 CONSTRAINT_TYPE이 CHECK인 제약조건의 내용을 볼 수 없습니다. 내용을 확인하기 위해서는 아래의 쿼리문을 실행해야 합니다. SELECT * from INFORMATION_SCHEMA.CHECK_CONSTRAINTS WHERE TABLE_NAME = '{테이블명}' *위 쿼리를 실행했을 때 결과 여기서 CHECK_CLAUSE가 CHECK 제약조건의 내용입니다. 추가 ALTER TABLE {테이블명} ADD CONSTRAINT {제약조건명} {제약조건} --예시 ..

SQL/RDBMS 2023.03.17

[Oracle] 제약 조건 (조회, 추가, 수정, 삭제)

조회 SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = '{테이블명}' * 위 쿼리를 실행했을 때 결과 여기서 CONSTRAINT_NAME이 제약조건이름이고 SEARCH_CONDITION이 제약조건이다. 추가 ALTER TABLE {테이블명} ADD CONSTRAINT {제약조건명} {제약조건} * 제약조건 예시 CHECK(COL1 IN ('A','B','C')) "COL1" IS NOT NULL 컬럼 데이터타입이 number(float, decimal...)인 경우에는 IN (1~9)가 아니라 BETWEEN을 써야함. CHECK(COL1 BETWEEN 1.0 AND 9.0) *ORA-02293: ()을 검증할 수 없습니다 - 잘못된 제약을 확인합니다 참고로 추가,..

SQL/RDBMS 2023.03.16

java.sql.SQLSyntaxErrorException: ORA-00911: 문자가 부적합합니다

ORA-00911: 문자가 부적합합니다 다른 글을 검색해 봤을 때 쿼리문에 ;가 들어가서 에러가 나는 경우가 많다고 하는데 String sql = "" PreparedStatement pstmt = con.prepareStatement(sql); retVals = pstmt.executeUpdate(); pstmt.close(); INSERT INTO TABLENAME(`COL1`, `COL2`, `COL3`) VALUES ('col1data1', 'col2data1', 'col3data1'), ('col1data2' ,'col2data2', 'col3data2'), ('col1data3' ,'col2data3', 'col3data3') ON DUPLICATE KEY UPDATE `COL2`= VALUE..

SQL/RDBMS 2023.03.14