Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ddodoi 님의 블로그

8주차-파트04: MySQL 에러: errno: 121, Foreign Key 제약조건, IN, SQL로 배열 값 받기 본문

웹풀스택 일일정리

8주차-파트04: MySQL 에러: errno: 121, Foreign Key 제약조건, IN, SQL로 배열 값 받기

ddodoi 2024. 10. 13. 20:17

CHAPTER 1. MySQL 에러: errno: 121 "Duplicate key on write or update

 

cartItems테이블의 foreign키를 설정하던 중 에러가 발생하였다.

 

에러명 : errno: 121 "Duplicate key on write or update

 

이유는 즉슨 foreign key 제약조건의 이름이 예전에 설정해둔 것과 같아서였다. 따라서 제약 조건명을 바꾸어주면 된다.

 

cartItems테이블의 book_id와 user_id는 각각 books테이블의 id, users테이블의 id를 참조한다. 근데  이 두 칼럼은 likes테이블에서도 참조하고 있다.

db diagram관계도

 

 

MySQL에서 foreign키를 연결 해줄 때 Foreign Key 제약조건 Name을 직접 설정해줄 수 있다. 다음 사진은 cartItems에서 foregin키를 설정해주는 모습으로 제약조건명이 book_id, user_id이다.

cartItems의 foreign키 제약조건

 

다음 사진은 likes테이믈에서 foreign키 제약조건을 설정했던 것이로 제약조건명 중 이름이 user_id인것이 있다. 이것이 겹쳐서 오류가 난 것이다.

likes의 foreign키 제약조건

 

 

 

<foreign key 제약조건 이름짓기>

fk기준 테이블명 참조테이블명 참조키

 

ex)

cartItems.users_id > users.id :  fk_cartItems_users_id

likes.user_id > users.id           :  fk_likes_users_id

 

 

 

 

 

 

CHAPTER 2. IN

✔️IN : 조회하고자 하는 값이 여러개일때 데이터를 목록에 넣어 지정한다.

여러개의 목록 값중 하나라도 만족하면 조건에 해당하는 결과를 출력한다.

 

 

 

 

CHAPTER 3. SQL로 배열 값 받기 

 

sql문에 여러개 입력 받을 곳을 (?)로 표기한 뒤 그대로 배열을 받아 넣어주면 된다.

//장바구니에서 아이템 조회
const getCartItems = (req, res) =>{
    const {user_id, selected} = req.body;

    let sql = `SELECT cartItems.id, book_id, title, quantity, price FROM Bookshop.cartItems 
                LEFT JOIN Bookshop.books ON books.id = cartItems.book_id
                WHERE cartItems.user_id = ? AND cartItems.id IN (?)`;
    let values = [user_id, selected];          
    conn.query(sql, values, (err, results) =>{
        if (err){
            console.log(err)
            return res.status(StatusCodes.BAD_REQUEST).end();
        }
        return res.status(StatusCodes.OK).json(results);
        })
};

 

 

실행 시