객체를 정의하는 것이다. 참조 무결성때문에 PK값을 수정하거나 레코드를 삭제할 수 없다.
방법이 있다면 FK의 참조값을 null로 설정하여 참조를 끊는 수 밖에 없다.
상당히 비효율적이다.
이 때, CASCADE로 해결이 가능하다.
외래키 제약 조건에 CASCADE 키워드를 포함시키면 된다.
CREATE TABLE Orders (
OrderID int NOT NULL,
OrderNumber int NOT NULL,
CustomerID int,
PRIMARY KEY (OrderID),
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);
원래라면 객체로 등록할 수 없는 SELECT 명령을 객체로서 이름을 붙여 관리할 수 있도록 한 것
객체이기 때문에 DDL로 작성, 삭제한다.
뷰의 작성
CREATE VIEW 뷰명 AS SELECT명령;
뷰의 삭제
DROP VIEW 뷰명;
트랜잭션 처리 중에 지정한 레코드를 락을 하는 구문입니다.
행단위로 동시 접근을 제어
항공편 예약 시스템 case
BEGIN;
-- 특정 항공편 좌석 조회 및 잠금
SELECT * FROM Flights WHERE FlightID = 1234 AND SeatNumber = '12A' FOR UPDATE;
-- 예약 가능 여부 확인 후 예약 처리
UPDATE Flights SET IsBooked = 1 WHERE FlightID = 1234 AND SeatNumber = '12A';
COMMIT;
한 사람이 예약을 하는동안 다른 사람이 동일한 좌석을 예약하는 것을 막아준다.
즉, 먼저 락을 구한 커넥션은 실행을 지속하고 락을 구하지 못한 커넥션은 트랜잭션이 종료되기 전까지 대기한다.
그 락을 구한 커넥션이 커밋을 하면 그 때 실행이 된다.
참고: DB 동시 수정 막기 - select … for update 이용
by 최범균
SELECT 문에서 여러 개의 열을 그룹핑하기 위한 절
SELECT expression1, expression2, ... expression_n,
aggregate_function (expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, ... expression_n;
어떤 기준으로 정렬을 시킬 때 사용되는 절
SELECT expressions
FROM tables
[WHERE conditions]
ORDER BY expression [ ASC | DESC ];
ASC | DESC: ASC는 오름차순, DESC는 내림차순을 얘기한다.
입력할 수 있는 폼(ex. 로그인 비밀번호)에 조작된 질의문을 넣어 정보를 해킹하는 걸 뜻한다.
비밀번호 입력란에 123 or '1'='1' 을 입력하면 true로 평가('1' = '1' 이 true)가 되서 로그인이 가능해진다.
원래 등록되어 있던 아이디가 user라고 하자. 위와 비슷한 논리로 아이디칸에 user--라고 입력하면 where절에서 user 뒤에 부분이 --로 인해 주석처리가 되어서 비밀번호가 입력을 안해도 되버린다.
Query String을 쓰면 안되고 Parameter Binding을 써야한다.
${}(String Interpolation)를 쓸 때
#{}(Parameter Substitution)을 쓸 때
참고1: [10분 테코톡] 🙋♂️로비의 SQL 인젝션
참고2: SQL injection 공격 by 코딩애플
패스워드를 생으로 넣는 저장
패스워드에 salting을 하여 해쉬 값을 쓰게하여 해킹을 막도록 한다.
무분별한 SELECT *
필요없는 데이터까지 불러오게 하여 메모리 사용량을 불필요하게 늘리게 된다. 따라서, 내가 원하는 데이터만 명시를 해주는 것이 좋다.
PK AUTOINCREAMENT
기본키는 각 행을 식별하기 위한 것이기 때문에 연속할 필요가 없다.