728x90

데이터베이스 스터디로 러닝MySQL을 읽고 있다. 

공부한 내용을 정리해보겠다!

 

2.3 관계형 엔티티 모델

 

데이터베이스는

객체인 엔티티

엔티티간의 연결정보인 관계를 저장한다.

 

예) 엔티티는 제품과 고객, 둘의 관계가 판매

 

관계형 엔티티 entity relationship ER모델은

개념적 설계의 일반적인 접근 방식으로 요구사항을 디비의 관계와 엔티티의 형식적인 설명으로 변환할 때 도움이 된다.

 

 

2.3.1 엔티티 표현 방식

설계를 시각화하기 위해 ER모델링에는 ER다이어그램을 그리는 과정이 포함된다.

일반적으로 엔티티의 특징이나 속성을 저장하기 위헤 데이터베이스를 사용한다.

 

엔티티에 속한 속성은 해당 엔티티를 설명한다.

속성을 더 세분화해서 구성할 수 있다.

속성이 더 작은 단위로 구성된 경우 : 복합 속성

그렇지 않은 경우 : 단순 속성으로 분류

 

 

속성은 값이 동일한 엔티티를 구별하는데 도움이 된다. 고객을 구별하기 위해 각자 고유한 특성이 필요한데

이런 고유한 키 값을 기본 키라고 부른다.

기본 키 설정에는 신중해야한다.

예) 이메일을 기본키로 하면 , 이메일이 여러 개인 고객은? 이메일이 없는 고객은?

 

대체키로 사용할 수 있는 또 다른 속성을 보자면, 두 명의 고개개이 전화번호가 동일할 수 있으나 (전화번호는 기본키로 사용할 수 없음) 번호가 같아도 고객 이름이 같지 않기 때문에 전화번호와 이름을 복합 키로 사용할 수 있다.

엔티티로 식별할 때 사용할 수 있는 키가 여러 개일 수 있다.

대안 중 하나를 선택하거나 후보키 를 기본 키로 선택한다.

출처: https://jerryjerryjerry.tistory.com/49
키: 무언가를 식별하는 고유한 식별자 키의 종류로 기본키 , 슈퍼키, 대체키, 외래키 등이 있다.

슈퍼키 super key: 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합이다. 즉 유일성(고유한 데이터 속성)만 만족하면 슈퍼키가 될 수 있다. ex. 주민번호, 이름+나이, 학번

후보키 candidate key: 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합 후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족해야한다. ex. 주민전호, 학번, (이름+ 나이 는 2개의 속성으로 되어있어서 후보키가 될 수 없다. )

기본키(primary key: 후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성이다. 테이블에서 기본키는 오직 1개만 지정할 수 있다. null값을 절대 가질 수 없고, 중복된 값을 가질 수 없다.

대체키 alternate key:후보키가 두개 이상일 경우 그중에서 어느 하나를 기본키로 지정하고 남은 후보키들을 대체키라고 한다. 기본키로 선정되지 않은 후보키이다.

외래키 Foreign key: 테이블이 다른 테이블의 데이터를 참조하여 테이블 간의 관계를 연결하는 것. 다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 제약을 준다.

부모 테이블 먼저 삭제될 수 없다. 왜냐하면 부모테이블을 참조하는데 부모테이블이 삭제되면 자식테이블은 참조하는 것이 없어지기 때문에 외래키 오류가 생긴다. 외래키 관계에서 부모테이블을 삭제하려면 자식테이블 먼저 삭제한 후 부모테이블을 삭제해야한다. 

 

2.3.2 관계 표현

엔티티는 다른 엔티티와 관계를 가질 수 있다.

에) 고객은 제품을 살 수 있고, 학생은 수업을 수강할 수 있고, 직원은 주소를 가질 수 있다.

엔티티와 마찬가지로 관계 또한 속성을 가질 수 있다.

예) 판매를 고객 엔티티(고유한 이메일 주소로 식별됨) 와 특정 날짜 및 시간(타임스탬프)에 존재하는 몇 가지 제품 엔티티(고유한 제품ID값으로 식별됨) 사이의 관계로 정의할 수 있다. 관계의 양족에서 엔티티 수가 다를 수도 있다.

  • 다대다 
    • 고객이 원하는 수의 제품을 구입할 수 있고, 제품이 원하는 수의 고객에게 구입될 수 있다.
    • M:N
  • 일대다
    • 한 사람이 신용카드 여러개는 되지만 각 신용카드는 한 사람에게만 속함
    • 다대일 N:1
    • 여러개의 신용카드가 한사람에게 속해짐
  • 일대일 1:1
    • 자동차 엔진의 일련번호, 엔진에는 단 하나의 일련번호만 부여된다.
    • 일련번호는 하나의 자동차 엔진에만 속한다.

관계의 양쪽에 있는 엔티티의 수 (관계의 카디널리티cardinality)는

관계의 주요 제약 조건constraints을 정의한다.

관계의 카디널리티에 대해 신중히 생각할 것.

처음에는 일대일처럼 보이지만 나중에 복잡해즌 관계들이 많다.

예) 사람들이 때때로 이름을 바꿈, 경찰 디비에서는 더욱 그런 데이터가 있을 수 있다. 사람엔티티와 이름 엔티티를 다대다 관계로 모델링

 

중복된 값이 적을수록 좋다

주민번호를 조회하는 것처럼 중복 수치가 낮으면 빨리 데이터를 찾을 수 있기 때문

중복도가 낮을수록 카디널리티가 높다

중복도가 높으면 카디널리티가 낮다

 

카디널리티란?
테이블의 총 행 수에 대한 관계형 테이블 열의 고유 값 수

 

2.3.3 부분 참여와 전체 참여

엔티티 관계는 선택사항이거나 필수 사항이다.

선택사항 - 고객 엔티티는 구매 관계에 완전히 참여함

모든 고객이 제품을 구매했고 제품을 구매하지 않은 고객은 있을 수 없다.

부분적으로 참여 -고객이 제품을 구입할 수 있다.

 

즉 

부분참여가 비식별관계

전체참여가 식별관계

와도 같다고 한다. 

 

즉 부분적으로만 참여를 하여 값이 있어도 되고 없어도 되지만

ex. 회원가입시 유저의 주소 적어도 되고 안적어도 된다. 

전체참여는 식별을 할 수 있도록 필수적으로 있어야한다. 

ex. 회원가입시 유저의 주소가 필수적이다. 

 

 

요즘 추세는 식별/비식별관계를 잘 쓰지 않는다고 한다. 

외래키로 다른 테이블과 식별/비식별관계(Null일 수 있음)인 경우 

상위객체(소유엔티티)가 존재할 때 하위객체가 존재해야하기 때문에 

외래키 데이터를 삭제할 때 "참조 무결성 제약 조건 위반"이  발생할 수 있다. 

 

그래서 식별/비식별 대신

관계를 맺지 않고 키값을 갖는다고 한다. 그리고 인덱스를 걸어서 처리.

(인덱스를 건다는 것은 데이터베이스에서 특정 값을 빠르게 찾을 수 있게 기존 데이터를 정렬해놓아 검색할 수 있도록 하는 것)

 

 

 

2.3.4 엔티티 또는 속성

항목이 그 자체로 속성인지 아니면 엔티티인지 구분하기 어려운 경우가 있다

예) 속성이라 생각했던 이메일 주소는 그 자체로 엔티티가 될 수 있다.

이럴 경우 규칙을 사용해보기

  • 데이터베이스와 직접적인 관련이 있는가?
    • 직접적인 관계의 객체는 엔티티
    • 엔티티를 설명하는 정보는 속성에 저장되어야한다.
    • 예) 재고 및 판매 데이터베이스에서 이메일 주소 보다 고객이 중요하므로 이메일 주소는 엔티티보다는 고객의 속성이 되는 것이 좋다.
  • 항목 자체를 구성하는 요소가 있는가?
    • 만약 그렇다면 이런 구성요소를 나타낼 방법을 찾아야 한다.
    • 별도의 엔티티를 만드는 게 좋은 해결책이 될 수 있다.
    • 예) 학생성적 디비에서 학생 엔티티로 학생이 수강하는 수업, 연도 학기 저장, 수업 엔티티 별도로 생성.
  • 객체가 여러 개의 데이터를 가질 수 있는가?
    • 만약 그렇다면 여러 개의 데이터를 저장할 방법을 찾아야한다.
    • 가장 확실한 방법은 객체를 별도의 엔티티로 나타내는 것이다.
    • 예) 고객에게 이메일 주소가 하나이상 있다면 이메일 주소를 별도의 엔티티로 모델링한다.
  • 객체가 존재하지 않거나 알 수 없는 경우가 많은가?
    • 만약 그렇다면 이 객체는 사실상 일부 엔티티의 속성일 뿐이므로 별도의 엔티티로 만드는 편이 더 좋다.
    • 예) 학생 수업 성적을 저장하기 위해 모든 수업에 대한 성적 속성을 학생 엔티티가 취할 수 있다. 그러나 대부분 학생들이 일부 수업에 대해서만 성적을 받으므로 성적을 속성값으로 관리하지 않고 성적 엔티티로 별도 엔티티 집합으로 나타내는 것이 좋다.

2.3.5 엔티티 또는 관계

객체를 엔티티로 할지 관계로 할지 결정하는 쉬운 방법은

요구사항 명사를 엔티티

동사를 관계로 바꾸는 것!

예) 학위 프로그램은 하나 이상의 과정으로 구성된다 - 문장에

프로그램, 과정 - 엔티티 | 구성됨 - 관계

예) 학생이 프로그램에 등록합니다. 라는 문장에서는

학생, 프로그램 - 엔티티 | 등록 - 관계

설계를 단순하게 유지하고 가능하면 소소한 엔티티를 도입하지 말라

 

2.3.6 중간엔티티

 

다대다 관계를 새로운 중간 엔티티(연관엔티티)로 대체하고

원래 엔티티를 일대다 관계와 다대일 관계로 연결해

다대다 관계를 개념적으로 단순화할 수 있다.

 

예) 승객이 항공편을 예약합니다

승객, 항공편 - 엔티티 → 다대다 관계

 

한 승객이 예약 여러 번 할 수 있음

하지만 자리는 오직 한 승객에게 주어짐

이 관계(예약)의 카디널리티(관계의 양쪽에 있는 엔티티의 수)는 1:N

 

이와 마찬가지로

하나의 항공편에 많이 예약할 수 있지만

각 자리는 오직 한 항공편에서만 가능하므로

이 관계(배치)의 카디널리티 1:N

 

자리가 특정 승객과 특정 항공편과 연결되어야 하므로

자리 엔티티는 모든 엔티티와의 관계에 완전하게 참여한다. (자리가 필수로 있어야함!)

 

2.3.7 약한 엔티티와 강한 엔티티

약한 엔티티는 다른 엔티티에 종속되어 독립적으로 존재할 수 없으며,

식별 관계에 완전하게 참여한다. 반면 강한 엔티티는 자체적으로 고유하게 식별될 수 있는 엔티티이다.

출처: https://studyandwrite.tistory.com/427
강한 엔티티 타입은 자신의 키 속성만 이용해서 고유하게 엔티티들을 식별할 수 있는 타입
약한 엔티티 타입은 자신의 키 속성만으로 엔티티를 고유하게 식별할 수 없는 타입!

 

 

식별 관계에서 약한 엔티티는 부모 엔티티의 일부분이 되어 해당 엔티티를 식별한다. 그리고 약한 엔티티의 전체 키는 자신의 부분 키와 소유한 엔티티의 키를 조합한 값이 된다.

 

맥락을 바탕으로 적은 양의 정보로도 작업이 가능하다.

디비 설계에서는 다른 엔티티에 종속된 엔티티에 대한 주요 정보를 몇 개 생략할 수 있다.

예) 고객의 자녀 이름 저장하는 경우, 자녀 엔티티 만들고 부모를 잘 구분해주는 주요 정보만 저장할 수 있다.

이 경우 자녀 엔티티가 약한 엔티티이며

자녀엔티티와 고객 엔티티의 관계를 식별관계 라고 한다.

약한 엔티티는 데이터베이스에서 소유 엔티티와 독립적으로 존재할 수 없기 때문에 식별 관계에 완전하게 참여한다.

 

약한 엔티티는

해당 엔티티를 소유한 즉 강한 엔티티의 맥락 안에서

고유하게 구분되므로

약한 엔티티의 전체 키는

자신의 키(부분)와 소유한 엔티티의 키를 조합한 값이다

 

 

2.4 데이터베이스 정규화

데이터베이스 정규화는 관계형 디비의 구조를 설계할 때 중요한 개념이다

정규형의 목적 : 데이터의 중복을 줄이고 무결성을 향상하는 것

또한 정규화는 데이터베이스 구조를 재설계하거나 확장하는 프로세스를 효율화한다.

 

세 가지 정규형의 목표를 살펴본다

제 1정규형 1NF : 정규형(Normalization Form)

  • 개별 테이블에서 반복되는 그룹을 제거한다
  • 관련 데이터 집합에 대해 별도의 테이블을 만든다
  • 기본 키로 각 관련 데이터 집합을 식별한다.

만약 관계에 복합 또는 다중 속성이 포함된다면 제 1정규형을 위반한 것이다.

반대로 복합 또는 다중 속성이 포함되지 않는다면 제1정규형을 만족한다.

따라서 해당 관계의 모든 속성값이 단일 타입인 경우 이를 제 1정규형이라고 한다.

제 2정규형 2NF

  • 여러 행에 적용되는 값들의 집합은 별도의 테이블로 만든다
  • 이런 테이블들은 외래키 foreign key로 연결된다.

해당 레코드는 테이블의 기본키 (필요한 경우 복합키)가 아닌 다른 것에 종속해서는 안된다

제 3정규형 3NF

  • 키에 의존하지 않는 필드를 제거한다

해당 레코드 키의 일부가 아닌 값이 테이블에 없어야한다. 일반적으로 필드 그룹의 내용이 단일 레코드 이상에 적용될 수 있는 경우 해당 필드를 별도의 테이블에 배치하는 방법을 고려해야한다.

비정규형 UNF unnormalized form :

데이터 베이스 정규형 조건을 충족하지 않는 데이터베이스 모델을 말한다.

 

 

728x90

'데이터베이스' 카테고리의 다른 글

GraphQL란?  (0) 2023.02.13
몽고디비 공부중..  (0) 2021.11.10
728x90

prisma init

 

 

schema.prisma 파일안에 

datasource db {
    provider = "mysql"
    url      = "mysql://유저:비번@localhost:3306/markhouse__"
}

//Prisma Generate는 데이터 모델을 사용하여 Prisma Client를 생성하는 도구입니다. 
//Prisma Client를 사용하면 데이터베이스에 대한 CRUD 작업을 쉽게 수행할 수npx prisma migrate reset 있습니다.

generator client {
    provider = "prisma-client-js"
}

model User {
    id    Int     @id @default(autoincrement())
    email String  @unique
    name  String?
    posts Post[]
}

model Post {
    id       Int    @id @default(autoincrement())
    title    String
    author   User   @relation(fields: [authorId], references: [id])
    authorId Int
}

 

❯ npx prisma db push
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "markhouse__" at "localhost:3306"

MySQL database markhouse__ created at localhost:3306

🚀  Your database is now in sync with your Prisma schema. Done in 136ms

✔ Generated Prisma Client (4.10.1 | library) to ./node_modules/@prisma/client in 44ms

 

| markhouse__생김

 

 

 

 

+

만약 show tables를 실행했을 때 _prisma_migrations 테이블만 보인다면, 아마도 Prisma Migrate를 통해 생성한 마이그레이션 파일로 데이터베이스 스키마를 생성하지 않은 것으로 추정됩니다.

Prisma Migrate를 사용하여 데이터베이스 스키마를 생성하려면 다음과 같은 단계를 따라야 합니다.

  1. prisma init 명령어를 사용하여 Prisma 프로젝트를 초기화합니다.
  2. schema.prisma 파일을 생성하고, 데이터베이스 스키마를 정의합니다.
  3. prisma migrate save 명령어를 사용하여 마이그레이션 파일을 생성합니다.
  4. prisma migrate up 명령어를 사용하여 마이그레이션을 적용하여 데이터베이스 스키마를 생성합니다.

위 단계를 수행하고 나면 show tables 명령어를 실행하여 데이터베이스 내 모든 테이블을 볼 수 있습니다. 만약 테이블이 여전히 보이지 않는다면, DBeaver에서 해당 데이터베이스에 대한 연결을 확인해야 합니다. 데이터베이스 연결이 올바른지 확인하고, 다시 시도해 보시기 바랍니다.

 

 

권한 문제가 생긴다면

 

모든 사용자 조회하는 법 

SELECT user, host FROM mysql.user;

 

사용자 조회해보고

비밀번호 확인해볼 것(모른다면 재설정하기)

ALTER USER '사용자명'@'호스트명' IDENTIFIED BY '새로운 비밀번호';

또는

ALTER USER '사용자명'@'호스트명' IDENTIFIED WITH mysql_native_password BY 'new_password';

 

권한도 확인해볼 것

권한 체크 

SHOW GRANTS FOR 'database_user'@'localhost';

권한 주기

GRANT CREATE, DROP ON *.* TO 'database_user'@'localhost';

 

 

root 모든 걸 볼수 있는거 

다른 권한에서 만든 것도 볼 수 있음 

 

다른 유저로 안들어가졌던 이유는 그저 비번 틀려서 접근 안되었던 거였음. 

 

dbeaver는 그냥 mysql에서 만든 데이터 깔끔하게 보여주는 툴임. 

localhost, 유저, 비번 잘입력하면 연결은 되어서 생성됨

 

추가로 테이블 생성했을 때 mysql터미널에서는 생긴게 보이는데 dbeaver에 바로 반영안되는 이유가 뭐지?

아 dbeaver refresh 버튼 눌러서 새로고침하니까 있다 얏호~!~!~!~

 

 

 

+

 

root는 MySQL에서 가장 높은 권한을 가진 사용자입니다. root 사용자는 모든 데이터베이스와 모든 객체에 대한 모든 권한을 가지고 있습니다. 즉, root 사용자는 MySQL 서버에서 모든 작업을 수행할 수 있습니다.

MySQL에서 root 사용자는 기본적으로 "localhost" 호스트에서만 로그인할 수 있습니다. 이는 보안상의 이유로 설정되어 있습니다. 따라서, 원격 호스트에서 root 계정으로 로그인하려면 특별한 설정이 필요합니다.

그러나, root 계정은 매우 강력하며 위험하기 때문에 일반적으로 MySQL 서버에는 다른 사용자 계정을 만들어 사용합니다. 이렇게 하면 보안상의 문제를 최소화할 수 있습니다.

 

+

 

sudo는 "Superuser Do"의 준말로, 리눅스나 유닉스 시스템에서 일반 사용자가 시스템 관리자(root)의 권한을 일시적으로 얻을 수 있는 명령어입니다.

리눅스나 유닉스 시스템에서 root 계정은 시스템 전체를 관리할 수 있는 권한을 가지고 있으므로, root 권한을 가진 사용자로 로그인하면 시스템 보안에 큰 위험이 따릅니다. 따라서, 보안상의 이유로 일반 사용자가 root 권한을 가지지 못하도록 설정되어 있습니다.

이때, 일반 사용자가 시스템 관리 작업을 수행해야 할 경우, sudo 명령어를 사용하여 일시적으로 root 권한을 얻을 수 있습니다. 이때, 사용자는 자신이 수행하려는 작업을 sudo 명령어 뒤에 입력하면 됩니다.

예를 들어, 일반 사용자가 시스템 업데이트를 수행하려면 다음과 같이 sudo 명령어를 사용할 수 있습니다.

 

+

mysql_native_password는 MySQL에서 기본으로 제공하는 인증 플러그인 중 하나입니다.

이 플러그인은 기존의 비밀번호 인증 방식과 호환되도록 설계되어 있어, 기존에 비밀번호로 인증했던 사용자들도 계속해서 이 플러그인을 사용하여 인증할 수 있습니다.

auth_socket 플러그인과 달리, mysql_native_password 플러그인을 사용하는 경우에는 비밀번호가 필요합니다. 따라서, 해당 사용자의 비밀번호를 잊어버린 경우에는 비밀번호를 재설정해주어야 합니다.

만약 mysql_native_password 플러그인 대신 caching_sha2_password 플러그인을 사용하는 경우에는, 새로운 비밀번호를 설정할 때 IDENTIFIED WITH mysql_native_password 구문을 생략해야 합니다.

 

728x90
728x90

Docker는 개발자가 격리된 컨테이너 내에서 애플리케이션을 생성, 배포 및 실행할 수 있도록 하는 인기 있는 오픈 소스 컨테이너화 플랫폼입니다. 컨테이너는 모든 종속성 및 구성 파일과 함께 애플리케이션을 다양한 컴퓨팅 환경에서 일관되게 실행할 수 있는 단일 단위로 캡슐화하는 경량의 독립 실행형 휴대용 패키지입니다.

Docker는 애플리케이션과 해당 종속성을 컨테이너 이미지로 패키징하는 방법을 제공합니다. 그런 다음 기본 운영 체제나 하드웨어 아키텍처에 관계없이 Docker가 설치된 모든 머신에서 배포 및 실행할 수 있습니다. 이렇게 하면 호환성 문제의 가능성이 줄어들고 필요한 인프라를 설정하는 데 필요한 시간과 노력이 최소화되므로 애플리케이션을 더 쉽게 개발, 테스트 및 배포할 수 있습니다.

Docker는 소프트웨어 개발 업계, 특히 클라우드 컴퓨팅 및 DevOps 환경에서 널리 사용되며 마이크로서비스, 서버리스 아키텍처 및 기타 최신 클라우드 네이티브 애플리케이션을 구축하고 배포하는 데 필수적인 도구가 되었습니다.

 

 

Docker 컨테이너 vs Docker 이미지 

 

Docker 컨테이너는 Docker 이미지의 런타임 인스턴스입니다. 즉, 컨테이너는 이미지에서 생성되고 코드, 런타임, 시스템 도구, 라이브러리 및 설정을 포함하여 특정 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 가볍고 격리된 환경입니다.

컨테이너는 Docker가 호스트 시스템에 설치되어 있는 한 변경 없이 여러 환경에서 실행될 수 있는 이식 가능하고 일관된 단위로 애플리케이션과 해당 종속성을 패키징하는 방법을 제공합니다. 각 컨테이너는 자체 파일 시스템, 네트워킹 및 리소스와 함께 자체 격리된 공간에서 실행되며 동일한 호스트의 다른 컨테이너와 독립적으로 시작, 중지 및 제거될 수 있습니다.

 

반면 Docker 이미지는 컨테이너를 만드는 데 필요한 모든 지침과 종속성을 포함하는 정적 읽기 전용 청사진 또는 템플릿입니다. 이미지는 기본 이미지 또는 기타 기존 이미지에서 이미지를 빌드하는 데 필요한 단계와 명령을 정의하는 텍스트 파일인 Dockerfile을 실행하여 생성됩니다.

요약하면 Docker 컨테이너와 Docker 이미지의 주요 차이점은 컨테이너는 이미지의 런타임 인스턴스인 반면 이미지는 컨테이너를 만드는 데 사용되는 정적 사전 구성된 패키지라는 것입니다. 이미지는 컨테이너를 빌드하는 데 사용되고 컨테이너는 애플리케이션을 실행하는 데 사용됩니다.

 

Docker 이미지가 진짜 그 이미지인가?

 

아니요, Docker 이미지는 그림이나 사진이라는 의미에서 실제 이미지가 아닙니다. 대신 Docker 이미지는 특정 애플리케이션 또는 서비스를 실행하는 데 필요한 모든 필수 파일, 라이브러리 및 종속성을 포함하는 사전 구성된 휴대용 패키지입니다.

Docker에서 "이미지"라는 용어를 사용하는 이유는 개체 또는 장면의 사진을 찍는 것과 유사하게 애플리케이션의 특정 상태 또는 구성에 대한 스냅샷 또는 표현을 생성한다는 아이디어를 반영하기 때문입니다. Docker 이미지는 코드, 런타임 및 구성 설정을 포함하여 애플리케이션의 현재 상태를 캡처하고 모든 Docker 지원 환경에서 공유, 배포 및 실행할 수 있는 자체 포함 단위로 패키징합니다.

 

 

 

 

728x90
728x90

Prisma와 Nexus는 모두 GraphQL 개발을 보다 쉽고 간편하게 할 수 있도록 도와주는 도구입니다.

그러나 두 도구는 서로 다른 목적과 기능을 가지고 있으며, 서로 다른 역할을 합니다.

 

Prisma는 데이터베이스 ORM(Object-Relational Mapping)으로, 데이터 모델과 데이터베이스 스키마를 정의하고 데이터베이스에 접근할 수 있는 API를 제공합니다. Prisma는 데이터베이스 스키마를 정의하기 위해 prisma/schema.prisma 파일을 사용하며, 이를 통해 데이터 모델을 작성하고 데이터베이스를 마이그레이션하는 작업을 할 수 있습니다.

 

반면에 Nexus는 GraphQL 스키마를 코드 기반으로 작성하고 구성하는 도구입니다.

Nexus는 GraphQL API를 작성하기 위해 사용되며, Prisma에서 생성된 데이터베이스 API를 사용하거나 다른 데이터 소스로부터 데이터를 가져와 GraphQL API를 구성할 수 있습니다.

 

따라서 Prisma와 Nexus는 각각의 목적과 기능을 가지고 있으며, 같이 사용할 수 있습니다. Prisma는 데이터베이스 ORM으로서 데이터베이스에 대한 접근을 쉽게 하고, Nexus는 GraphQL API를 작성하기 위한 도구로서 Prisma와 함께 사용하여 간편하게 GraphQL API를 구성할 수 있습니다. Prisma와 Nexus를 같이 사용하면 보다 쉽고 간편하게 GraphQL API를 구성할 수 있습니다.

728x90
728x90

GraphQL은 Facebook에서 개발하고 오픈 소스로 제공하는 API(애플리케이션 프로그래밍 인터페이스)용 쿼리 언어 및 런타임입니다. API 구축을 위해 REST(Representational State Transfer)에 대한 보다 효율적이고 강력하며 유연한 대안을 제공합니다.

GraphQL API에서 클라이언트는 필요한 데이터를 지정하는 요청을 하고 서버는 고정된 데이터 집합이 아닌 요청된 데이터만 반환합니다. 이렇게 하면 데이터를 과도하게 가져오거나 적게 가져오지 않고 필요한 데이터를 정확하게 검색하고 여러 요청이 아닌 단일 요청으로 데이터를 받을 수 있습니다.

GraphQL은 또한 클라이언트와 서버 간에 교환되는 데이터에 대한 유형 시스템을 제공하여 요청과 응답이 실행되기 전에 유효성을 검사할 수 있도록 합니다. 그 결과 성능이 향상되고 복잡성이 감소하며 API가 더 예측 가능해집니다.

GraphQL의 또 다른 주요 기능은 실시간 업데이트 및 구독 지원으로, 실시간 및 협업 애플리케이션 구축에 매우 적합합니다.

전반적으로 GraphQL은 API를 구축하는 보다 효율적이고 유연하며 강력한 방법을 제공하며 특히 여러 데이터 소스 및 서비스와 상호 작용해야 하는 모바일 및 웹 애플리케이션을 위한 최신 애플리케이션 개발에 널리 사용되는 선택이 되었습니다.

GraphQL is a query language and runtime for APIs (Application Programming Interfaces) that was developed and open-sourced by Facebook. It provides a more efficient, powerful, and flexible alternative to REST (Representational State Transfer) for building APIs.

In a GraphQL API, the client makes a request specifying the data it needs, and the server returns only the requested data, rather than a fixed set of data. This makes it possible to retrieve exactly the data you need, without over- or under-fetching data, and to receive the data in a single request, rather than multiple requests.

GraphQL also provides a type system for the data being exchanged between the client and the server, making it possible to validate the requests and responses before they are executed. This results in better performance, reduced complexity, and a more predictable API.

Another key feature of GraphQL is its support for real-time updates and subscriptions, which makes it well-suited for building real-time and collaborative applications.

Overall, GraphQL provides a more efficient, flexible, and powerful way to build APIs, and has become a popular choice for developing modern applications, especially for mobile and web applications that need to interact with multiple data sources and services.

728x90

'데이터베이스' 카테고리의 다른 글

러닝MySQL 2장 데이터베이스 모델링과 설계  (0) 2024.02.18
몽고디비 공부중..  (0) 2021.11.10
728x90

The error message ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database '' in MySQL indicates that the user root@localhost doesn't have sufficient privileges to access the database specified in the command.

Here are the steps to resolve the issue:

  1. Connect to the MySQL server with an administrative account:
 
`mysql -u root -p`
  1. Grant the required privileges to the user:
 
`GRANT ALL PRIVILEGES ON database_name.* TO 'root'@'localhost';`

Replace database_name with the name of the database you want to grant privileges to. The ALL PRIVILEGES clause grants all privileges to the user, including the ability to create, modify, and delete data in the database.

  1. Flush the privileges to make the changes take effect:
Copy code
FLUSH PRIVILEGES;
  1. Try accessing the database again and see if the error still occurs.

This should resolve the issue and allow the user root@localhost to access the specified database.

 

728x90
728x90

In the context of relational databases, the terms "database" and "schema" are often used interchangeably, but they have different meanings.

A database is a collection of related data stored in a specific and organized way, allowing for easy retrieval and management of the data. A database can contain multiple tables, views, and other database objects.

A schema is a logical container for organizing database objects, such as tables, views, indexes, procedures, and functions, within a database. A schema provides a way to organize the database objects in a logical and meaningful manner.

In other words, a schema can be thought of as a blueprint or blueprint plan of how the database is structured and how the data is organized within it. A database can contain multiple schemas, and each schema can contain multiple tables and other objects.

In short, a database is a physical container for storing data, while a schema is a logical container for organizing the database objects within that data.

728x90
728x90

The error message SELECT command denied to user ''@'localhost' for table 'mysql.user' in DBeaver usually indicates that the user does not have sufficient privileges to access the mysql.user table.

Here are the steps to resolve the issue:

  1. Connect to the MySQL server with an administrative account.
  2. Run the following command to grant the required privileges:
 
GRANT SELECT ON mysql.* TO 'your_user'@'localhost';
 

Replace "your_user" with the username you are using to connect to the MySQL server.

  1. Flush the privileges to make the changes take effect:
 
FLUSH PRIVILEGES;
 
  1. Try connecting to the MySQL server using DBeaver again and see if the error still occurs.

This should resolve the issue and allow you to access the mysql.user table in DBeaver.

728x90
728x90

"mysql" is the basic command to start the MySQL client, which is used to connect to and interact with a MySQL server. This command assumes that you want to connect to the MySQL server as the current operating system user.

 

"mysql -u root -p" specifies the MySQL user account that you want to use to connect to the MySQL server. "root" is the username, and "-p" is the option that prompts for a password. So, this command connects to the MySQL server as the "root" user, and you need to enter the password for that user to access the MySQL server.

728x90
728x90

귯귯

 

자동생성 1초씩으로 해봄

 

 

 

이 데이터베이스 사용할거임

use testscedule;

 

이벤트스케줄러 켜져있는지 확인

 

show variables like 'event%';

on으로 켜져있음

 

만약off면 

 SET GLOBAL event_scheduler = ON;

로 활성화

 

(만약 시작될때마다 초기화로 꺼지면 요방법)

https://web-inf.tistory.com/17 

https://bizadmin.tistory.com/entry/mysql-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%9F%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

 



CREATE EVENT if not exists forme  //forme라는 이벤트 없으면 만듦
ON SCHEDULE EVERY 1 second //1초마다 실행
STARTS CURRENT_TIMESTAMP //지금시간부터 시작~
DO
INSERT INTO new_table (name) values ('hi');  //실행할 쿼리문~

 

 

 


SHOW EVENTS ; //이벤트 확인

 

이벤트 삭제

DROP EVENT IF EXISTs forme;

 

 

사실 해도 실행이 안됐었다. 

알고보니 insert에서 막히는 것이었음

만든 table 에서 id가 not null로 빈값 못들어가는데 name만 자꾸 넣어주려니까 안되었던 것이다.

id를 Auto Incremental로 자동 순번 지정되게 수정해주니 

name이 잘 들어갔다. id도 자동으로 들어가고

 

 

*schedule

오타^^+

 

 

 

 

 

https://soccerda.tistory.com/entry/MySQL-Scheduled-Event

 

MySQL Scheduled Event

오라클의 job과 유사한 기능을 지원하는 Mysql DB에는 scheduled Event기능이 있습니다. MySQL 이벤트 스케줄러 및 데이터베이스 작업을 자동화하는 방법에 대해서 기술하겠습니다. MySQL 이벤트는 미리

soccerda.tistory.com

 

728x90
728x90

조건

 

피보나치 수열

1 1 2 3 5 8 13 ...

 

이렇게 

1분 1분 2분 3분 

지날 때마다

-2%로 이자액이 원금에서 차감되게 식 만들기 

 

 

 

 

검색통해서 피보나치 구하는 식은 썼는데 

 

시간 흐를 때마다 추가되게끔은 못함..

drop database testDB;
create database testDB;

use testDB;
create table testDB(
id INT(11)  NOT NULL AUTO_INCREMENT,                
  name VARCHAR(45) ,                        
 deposit_date DATETIME,                      
deposit_amount INT,                                   
interest_amount INT,
 CONSTRAINT testTable_PK PRIMARY KEY(id)                     
);

set @setTime = (select subtime(now(),'00:02:00'));

insert into testdb (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop function if exists fibo_number;
DELIMITER //
CREATE FUNCTION fibo_number(n INT) RETURNS INT
DETERMINISTIC
BEGIN
	
    DECLARE f_0 INT default 0;
    DECLARE f_1 INT default 1;
    DECLARE out_fib INT;
    DECLARE i INT;
    DECLARE f_2 INT;

    SET f_0 = 0;
    SET f_1 = 1;
    SET i = 1;

    
    WHILE (i<=n) DO
   
        SET f_2 = f_0 + f_1;
        SET f_0 = f_1;
        SET f_1 = f_2;              
       SET i = i + 1;  
       SET out_fib = f_0;          
	
    END WHILE;
    	  RETURN out_fib;


END //

set @n =  (select fibo_number(6))//
select @n//

drop procedure if exists pro//
create procedure pro()
begin

while (select id from testdb order by id desc limit 1) < 10 do
INSERT INTO testdb (name,deposit_date,deposit_amount,interest_amount) 
select 
(select  MIN(name) from testdb),
date_add((select MAX(deposit_date) from testdb),INTERVAL @n minute),
((select MIN(deposit_amount) from testdb ) - (select MAX(interest_amount) from testdb)),
(select deposit_amount from testdb where id =1)* 0.02;
end while;
end //
delimiter ;

call pro();

select * from testdb;

 

https://shoark7.github.io/programming/algorithm/%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-5%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95.html

 

피보나치 수열 알고리즘을 해결하는 5가지 방법

Let me introduce 5 different ways to solve fibonacci algorithm

shoark7.github.io

https://hongjw1938.tistory.com/47

 

알고리즘 - Dynamic Programming(동적 계획법)

1. 개요 DP, 즉 다이나믹 프로그래밍(또는 동적 계획법)은 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것으

hongjw1938.tistory.com

https://stackoverflow.com/questions/69821788/create-and-call-mysql-function-to-find-fibonacci-numbers-till-n-numbers

 

Create and call MYSQL Function to find Fibonacci numbers till n numbers

My approach DELIMITER $$ CREATE FUNCTION fibonacci(num INT) RETURNS INT DETERMINISTIC BEGIN DECLARE fib1 INT DEFAULT 0; DECLARE fib2 INT DEFAULT 1; DECLARE fib3 INT DEFAULT 0; DECLA...

stackoverflow.com

 

728x90
728x90

 

https://stepby-yun.tistory.com/193

 

한시간씩 이자율 넣기 while문 사용, update,order by limit

https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은..

stepby-yun.tistory.com

 

max 랑 min써서 잘들어가긴했는데

order했을때 왜 null떴나 싶어서 

다시 해봄

 

 

 

 

 

 

where 조건문을 잘못넣었네

 

 

 

 

 

 

where interest_amount 

빼니까 잘 들어감

 

 

 

 

없네

근데

다른애들은 where 있고 없고 결과값 똑같은데 뭐지

일단 확실한건 

where 조건문

인데 조건문아니고 테이블만 써서 잘못되긴함. 

 

<수정결과>

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence  order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence order by id desc limit 1) + (select interest_amount from sequence  order by id desc limit 1)),
(select deposit_amount from sequence where id=1)* 0.04 /12;


end while;
end //
delimiter ;

call pro();




select * from sequence;

 

 

 

 

+

참고로 empty set이 무어냐

쿼리 수행 결과가 없다는 뜻

 

 

https://www.tutorialspoint.com/What-is-the-meaning-of-empty-set-in-MySQL-result-set

테이블 조건만으로는 그 값을 찾을 수 없었나봐...

 

728x90
728x90

https://stepby-yun.tistory.com/194

 

MAX MIN order by limit 차이 뭘 쓸지

https://stepby-yun.tistory.com/193 한시간씩 이자율 넣기 while문 사용, update,order by limit https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/1..

stepby-yun.tistory.com

지난 시간

max나 min쓰자~

 

 

 

이번에는 줄어드는 계산식

 

이전코드에서 
빼면 되겠거니~~했는데!

오잉

 

아 이전에는 deposit_amount가 점점 커져서 

MIN 최소값에 이자율곱해서 이자액 구했는데

이제는 줄어들어서 최대값 사용해서 이자금액 구해야하는구나

 

MAX로 바꿈

음...

아 최대값에서 빼주니까 안줄어드는구나

 

최소값(마지막행)에서 빼주기로 변경

 

 

 

굿굿~

 

이자율만 수정하면 끝

 

 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MIN(deposit_amount) from sequence) - (select MAX(interest_amount) from sequence)),
(select MAX(deposit_amount) from sequence)* 0.02;


end while;
end //
delimiter ;

call pro();


select * from sequence;

 

 

 

 

 

 

이거는 order by 랑 섞어서 쓴거. 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do

INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) - (select MAX(interest_amount) from sequence)),
(select deposit_amount from sequence where id =1)* 0.02;

end while;
end //
delimiter ;

call pro();

select * from sequence;

똑같음

 

 

 

 

 

이제 예산이 0 될때까지 해볼게

 

 

끝~

 

 

+

 

참고로 >= 0로 해봤는데

0보다 크거나 같다고 하니까 에러뜸

 

 

이거보니 타입이 unsigned로 되어있는데 

음수값이 나오려고 해서 에러뜨는거라함

 

아하 deposit_amount가 0일때 while문을 돌리면

interest_amount 값을 0에서빼게 되니까

음수값이 들어가게 되는구나

 

https://wwwnghks.tistory.com/122

 

[Mysql] SQL 오류 (1690): BIGINT UNSIGNED value is out of range in 에러 발생시

SQL 오류 (1690): BIGINT UNSIGNED value is out of range in.... 위의 에러 발생 이유는 아래와 같이 컬럼명의 타입이 unsigned 로 되어있고, 음수의 값이 발생되는 경우 발생된다. select (컬럼명 - 100) from..

wwwnghks.tistory.com

 

728x90
728x90

https://stepby-yun.tistory.com/193

 

한시간씩 이자율 넣기 while문 사용, update,order by limit

https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은..

stepby-yun.tistory.com

지난시간~

 

 

select deposit_amount where  deposit_amount order by id desc limit 1

이 order by id dec limit 1

을 사용해서 마지막행 값을 구했었다. 

 

 

우와 max로 썼더니 

null값 사라짐!

 

확실한 건 코드가 짧아져서 너무 좋음ㅋㅋㅋㅋ

구하려는 열과 테이블만 적으면 됨

 

 

 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MAX(deposit_amount) from sequence) + (select MAX(interest_amount) from sequence)),
(select MIN(deposit_amount) from sequence)* 0.04 /12;


end while;
end //
delimiter ;

call pro();



select * from sequence;

 

 

 

근데 둘의 차이가 뭘까? 뭘쓰는게 좋을까

 

 

단순히 테이블에서 최대값, 최소값을 찾고 싶다면

MAX() MIN() 함수 활용하는게 간단하다

 

최대값 또는 최소값을 갖는 row 열을 찾는 경우,

order by limit 1 을 사용한다.

 

 

 

 

성능으로 봤을 때 min을 쓰는게 좋다

 

 

min은 바로 최솟값을 가져오지만

order by limit1은 실행할 때마다 정렬을 한다. 

 

최악의 경우, 인덱스가 없는경우

min 이 order by limit 1 보다 빠르다

최선의 경우, 인덱스가 있는경우

min 과 order by limit 1 의 성능을 비슷하다

하지만 그래도 order by limit1은 실행할 때마다 정렬을 한다. 

 

 

 

 

 

최대값

select MAX(컬럼) from 테이블;

최소값

select MIN(컬럼) from 테이블;

 

 

 

ORDER BY

정렬할 때 사용

 

asc:오름차순 (안써도 된다)
desc:내림차순

 

limit 가져오는 레코드의 개수를 제한한다

 

 

 

 

 

 

 

https://eyeballs.tistory.com/463

 

[SQL] Min 과 Order By limit 1 중 어느 것을 사용해야 할까?

min 과 order by limit 1 중 어느 것이 더 나은 성능을 보일까? 그래서 어느 것을 사용해야 할까? < 결과 > min 값만 구하는 경우 min 을 사용 min 값을 갖는 row 를 찾아야 하는 경우 order by limit 1 을 사용 <..

eyeballs.tistory.com

https://stackoverflow.com/a/426785

 

MIN/MAX vs ORDER BY and LIMIT

Out of the following queries, which method would you consider the better one? What are your reasons (code efficiency, better maintainability, less WTFery)... SELECT MIN(`field`) FROM `tbl`; SELECT `

stackoverflow.com

https://www.inflearn.com/questions/23797

 

max/min vs. order by + limit 질문 - 인프런 | 질문 & 답변

안녕하세요, 최대값과 최소값 찾는 방법에 대해 질문드려요. 가장 쉬운 방법으로는 MAX() 와 MIN()를 쓰는 방법이 있는데, 수업 중에 선생님께서 order by ___ desc, limit 1 와 order by ___ asc, limit 1도 가르

www.inflearn.com

 

https://sql-factory.tistory.com/634

 

 

 

 

MySQL MIN / MAX 대 ORDER BY 및 LIMIT

다음 쿼리 중 더 나은 방법을 고려할 수있는 방법은 무엇입니까? 당신의 이유는 무엇입니까 (코드 효율성, 더 나은 유지 보수성, 덜 WTFery) ... SELECT MIN(`field`) FROM `tbl`; SELECT `field` FROM `tbl` ORDE..

sql-factory.tistory.com

https://pram.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%BA%BC%EB%82%B4%EA%B8%B0select-ORDER-BY-LIMIT

 

728x90
728x90

https://stepby-yun.tistory.com/192?category=554522 

 

mysql while 여러시도..

https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은 의문을 가지신 분 프로시저 꼭 만들어서 써야돼? https://stackoverflow.com/q..

stepby-yun.tistory.com

프리비어슬리~

 

새로 생긴 행이랑 이전 행 시간을 빼서 1분 이상일때마다

값을 넣어줄까? 했는데 무한insert되고 난리남

 

(이 글의 결론)

1분이 흐를때마다 ->이자증액값을 넣어준다

에서

값넣는다. 1분마다시간증가, 이자증액, 

이렇게

insert할때 한꺼번에 넣는 걸로 식만듦..(저번에 한달씩 증가랑 똑같이 함.)

------

 

 

 

기준 잡기의 중요성..

한 시간씩 증가하고

넣고 먼저 해보자

최대증가한 시간

몇번째 행의 시간이 얼만지 생각! 

 


 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,'10000000','0');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) + (select interest_amount from sequence where  interest_amount order by id desc limit 1)),
(select deposit_amount from sequence where id='1')* 0.04 /12;

end while;
end //
delimiter ;

call pro();

select * from sequence;
 


아 다음행에 insert 추가 되는게

마지막 id가 9이니까

 

10까지 뜨는거구나~!!

 

그래도 deposit_amount의 마지막행 10000000을 구해서 이자액 33333을 구했으면 

 

2번째 행에 deposit_amount도 들어갈 수 있는거 아닌가 왜 

 

null값이지? 

 

 

+

 

지금은 한번에 들어가는거니까 

날짜를 추가하고 추가될때마다 이자액이 찍히게 하면 되려나...

 

 

update써서 해보자

 

update 안되는이유 여기서 세팅 설정바꿔줘야함

https://lightblog.tistory.com/193

 

[MYSQL] 에러 번호 1175 Safe Update 해결방법

MySQL에서 쿼리를 실행하다보면 다음과 같은 에러를 마주할 때가 있다. Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable..

lightblog.tistory.com

오마갓 숫자를 ''

여기 넣어서 문자열로 만들어서 쓰고있었네

 

 

 

 

하지만 잘 안됨

use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);





drop procedure if exists pro;
delimiter //
create procedure pro()
begin
DECLARE n varchar(45) default "이소윤" ;

while (select id from sequence order by id desc limit 1) < 10 do
INSERT INTO sequence (deposit_date) select (date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour));

update sequence 
set 
name = n,
interest_amount =  (select deposit_amount where  deposit_amount order by id desc limit 1)* 0.04 /12;




end while;

end //
delimiter ;
call pro();

select * from test.sequence;


 

---

시간 증가만 insert해주고

나머지는 update로 넣어주려 했으나 잘안됨..

그래서 원래 한번에 다 insert한 걸로 수정함

 

중간에 null인거..

 

 

그냥 id가 2인거 조건으로 넣어줌..

이러면 안될거같지만

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) + (select interest_amount from sequence where  interest_amount order by id desc limit 1)),
(select deposit_amount from sequence where id='1')* 0.04 /12;


end while;
end //
delimiter ;

call pro();

update sequence 
set deposit_amount = 10000000
where id = 2;


select * from sequence;

 

 

 order by limit 1

를 쓰는 것보다 max가 좀더 빠르다는 얘기를 들음

내일 수정해봐야겠다

 

728x90
728x90

https://stepby-yun.tistory.com/191

 

mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER )

while문 해보려는데.. 나와같은 의문을 가지신 분 프로시저 꼭 만들어서 써야돼? https://stackoverflow.com/questions/12954095/mysql-declare-while-outside-stored-procedure-how mysql DECLARE WHILE outside..

stepby-yun.tistory.com

지난시간...

while문 해보려다가 프로시저로 감싸야한다길래 그거 공부했다.

 

다시 while문 해보자~

 

 

create procedure pro(i int)
begin 
while i < 5 do
insert into sequence (interest_amount) values (i);
set i = i +1;
end while;
end
//
DELIMITER ;

call pro(0);

 

 

 

 

 

 

커맨트 창에 명령어입력할때 한 줄씩 넣어야 작동하네...

while 기본적인 거 했으니까 과제해보기

 

 

1시간씩 이자액 증가하기 

명령문 실행했을 때

기준 시간보다 몇 시간 지나있으면 그 몇시간 만큼 이자액 증가. 

 

 

DELIMITER //

create procedure pro(i)

while   if (기준시간 + 1 분 * i) > 기준시간 ,이면 실행한다.   do

이자액 증가 실행 

insert into sequence (interest_amount) values (증가한 이자액 넣기);

set i = i+1;

end while

end

 

//
DELIMITER ;

 

 

call pro(0)

 

 

 

0부터 시작해서 

기준시간

 

 

 

----

몇분이 지났는지는 

금액으로 넣어줘야되려나?

 

 

 

조건은 1분씩 이자액이 들어갈거임

 

지금시간보다 1분증가

현재시간이 기준시간보다 n분이상이면

if now >

n분 증가할때마다 이자율 증가

 

 

https://ponyozzang.tistory.com/697

 

MySQL 날짜, 시간 계산 DATEDIFF, TIMEDIFF 사용 방법

MySQL에서 날짜 함수를 사용해 날짜 또는 시간 게산을 하는 방법을 알아보겠습니다. 날짜와 시간 계산에 관련된 함수가 어떤 것이 있는지 먼저 간단히 보겠습니다. DATEDIFF() - 두 기간 사이의 일수

ponyozzang.tistory.com

SELECT * FROM test.sequence;
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while @min < 30 do
set @min = minute((SELECT TIMEDIFF(now(),'2022-05-11 10:30:00')));
set @deposit_amount =(select deposit_amount from sequence where id='1');
select @min;
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end while;
end //
delimiter ;

call pro();

 

오 뭔가 함 근데 계속 들어가!!!!

1분 지났을때만 추가되어야하는데..

 

 

SELECT * FROM test.sequence;
truncate sequence;

insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while @min <10 do
set @min = minute(   (SELECT TIMEDIFF(now(),'2022-05-11 11:48:00'))   );
set @deposit_amount =(select deposit_amount from sequence where id='1');
select @min;
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end while;
end //
delimiter ;

call pro();



1분마다 바뀌어야하는데 초 차이날때마다 업데이트됨

워크벤치에서 한번에 실행하고 싶은데 왜 cmd에서는 잘되어도 워크벤치는null값으로 계속 찍힐까?

 

 

 

계속 찍힘 이렇게..

-------------------

 

SELECT * FROM test.sequence;SELECT * FROM test.sequence;
truncate sequence;

insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin

set @deposit_amount =(select deposit_amount from sequence where id='1');
while @min <10 do
set @min = minute(   (SELECT TIMEDIFF(now(),'2022-05-11 14:26:00'))   );
if ( @min /@min >0) then
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end if;
end while;

end //
delimiter ;

call pro();

 

----

 

set @lastTime = (select deposit_date from sequence where  deposit_date order by id desc limit 1);

 

만약, 이전분보다 1분 흘렀으면

if   (SELECT TIMEDIFF(now(),마지막행시간)) > '00:01:00'

set 흐른분 = minute(SELECT TIMEDIFF(now(),마지막행시간))

마지막행에 넣기 흐른분* 이자율 

 

 

////////////////

SELECT * FROM test.sequence;SELECT * FROM test.sequence;
truncate sequence;
set @test = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@test,'10000000');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while @min <30 do
set @interestAmount = (select interest_amount from sequence);

if   (SELECT TIMEDIFF(now(),@lastTime)) > '00:01:00' then
set @lastTime = (select deposit_date from sequence where  deposit_date order by id desc limit 1);
set @min = minute(   (SELECT TIMEDIFF(now(),@lastTime))   );
if ( @interestAmount !=  @interestAmount) then
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end if;
end if;
end while;
end //
delimiter ;

call pro();

 

 

 

///////////

SELECT * FROM test.sequence;SELECT * FROM test.sequence;
use test;
truncate sequence;
set @test = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@test,'10000000');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while  do
set @min = minute(   (SELECT TIMEDIFF(now(),(select deposit_date from sequence where  deposit_date order by id desc limit 1)))   );
set @interestAmount = (select interest_amount from sequence where interest_amount order by id desc limit 1);

if    @min > '0' then
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
if ( @interestAmount !=  @interestAmount) then
insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end if;

end if;
end while;
end //
delimiter ;

call pro();

 

/////////////

 

------------

 

 

 

마지막에서 1꺼

마지막에서 2한번더 들어간거!

이렇게 

수정해야겠다. 왜냐면 

id=2부터 이자액 들어가니까

 

use test;
truncate sequence;

set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@setTime,'10000000');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
set @min = minute((SELECT TIMEDIFF(now(), @setTime)));
set i =1;

while i <= @min do
set i = i +1;
set @interest_amount = (select interest_amount from sequence where  interest_amount order by id desc limit 2);
set @Prev_interest_amount = (select interest_amount from sequence where  interest_amount order by id desc limit 3);

if (@interest_amount != @Prev_interest_amount) then 
 insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end if;
end while;
end //
delimiter ;

call pro();

 

흑흑 안돼...

 

 

왜 삭제 안되지?????

 

 

use  test;

를 빼먹었나 그거 하고 하니까 됨

 

 

/////

여러번으 시도를 했지만 안됨..

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));
select @setTime;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@setTime,'10000000');
select * from sequence;

drop procedure if exists pro;
delimiter //
create procedure pro(i int)
begin
set @min = minute((SELECT TIMEDIFF(now(), @setTime)));
select @min;


while i <= @min do
set i = i +1;
select i;
set @interest_amount = (select interest_amount from sequence where  interest_amount order by id desc limit 1);
set @Prev_interest_amount = (select interest_amount from sequence where  interest_amount order by id desc limit 2);

if (@interest_amount != @Prev_interest_amount) then 
 insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12));
end if;
end while;
end //
delimiter ;

call pro(1);
select * from sequence;

728x90
728x90

while문 해보려는데..

나와같은 의문을 가지신 분

프로시저 꼭 만들어서 써야돼?

https://stackoverflow.com/questions/12954095/mysql-declare-while-outside-stored-procedure-how

 

mysql DECLARE WHILE outside stored procedure how?

I fairly new to mysql but have MS SQL experience. Is it possible to declare variables and use while statement outside stored procedure? I only found examples where guys doing like this 1. proced...

stackoverflow.com

안된데 따흑.

https://dev.mysql.com/doc/refman/8.0/en/sql-compound-statements.html

^공식문서...

 

 

방금 스택오버 따라서 코드 처보는데

DELIMITER 

이거 맨앞에 넣어야 빨간줄 안뜨네

너 뭐야..

 

공식문서가 말하길,,

"기본적으로 mysql 자체는 세미콜론을 명령문 구분 기호로 인식하므로 mysql 이 전체 ​​저장 프로그램 정의를 서버에 전달하도록 하려면 구분 기호를 일시적으로 재정의해야 합니다.

mysql 구분 기호 를 재정의하려면 delimiter명령을 사용하십시오. //전체 정의를 단일 명령문으로 서버에 전달한 다음 ;프로시저를 호출하기 전에 로 복원할 수 있도록 구분 기호가 변경됩니다 . 이렇게 하면 프로시저 본문에 사용된 구분 기호가 mysql 자체 ; 에서 해석되지 않고 서버로 전달될 수 있습니다."

 

어 그렇구나..(이해못함)

https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html

 

식 사이를 구분지어주는 거같음

 

아니!! 근데!!! 아무것도 안나와 

-> 계속 생기고 뭐지

세미콜론으로 끝내려는데도 안됨

뭘까..?

 

 

 

 

 

아하!

 

MySQL 콘솔창은 쌍반점(;)이 입력되면 어떤 경우에서건 일단 쌍반점(;) 이전 단계까지 명령문을 실행하게 됩니다.

구분 문자(;) 변경하기

명령분이 완성되지 않은 상태에서 실행되면 곤란합니다. 저장 프로시저에서 END를 입력하고 나서 CREATE PROCEDURE 명령이 실행되도록 환경을 변경해야 합니다.

 

그러려면 저장 프로시저를 작성하기 전에 구분 문자를 쌍반점(;)이 아닌 다른 문자로 변경해 둡니다. 일반적으로는 //을 사용합니다.

 

구분 문자를 //으로 변경할 때에는 DELIMITER 명령을 사용합니다.


맨 마지막의 DELIMITER ;는 구분 문자를 원래대로 되돌려 놓는 명령입니다. 구분 문자를 쌍반점(;)으로 되돌려 놓는 것을 잊지 않도록 합니다.

출처: https://recoveryman.tistory.com/186 [회복맨 블로그]  회복맨, 당신은 최고의 정리맨이자 설명맨입니다. 짱짱~


 

DELIMITER 가 구본문자를 바꾸는 명령어구나

구본문자를 세미콜론에서 //이걸로 바꿔놓고 

안된다고 하고 있었구나....ㅋㅋㅋㅋㅋㅋ

 

 

 

DELIMITER //
create procedure pro()
begin 
select name from sequence;
select deposit_date from sequence;
end
//




DELIMITER ;

call pro;

 

 

삭제하고 다시 만들어봐야지

 drop procedure if exists 프로시저 이름;

 

 

임의로 값 넣어놓음

 

DELIMITER //

구본문자//로 바꾸고

create procedure pro(d int)

프로시저 pro만들고 int형 인수d들어가게끔 사용할거임
begin 

시작
select * from sequence where interest_amount < d;

다가져와 seuquence 테이블에서 interest_amount가 d보다 작은 것중에서
end


//

프로시저 끝


DELIMITER ;

구본문자 다시 ;로 바꿈

call pro(3);

프로시저 실행. 인수에 3넣고 (3보다 작은 interest_amount 가져올거임)

 

 

 

 

이제 다시 while문 해봐야지..

 

https://recoveryman.tistory.com/186

 

[MySQL & PHP] 12장 저장 프로시저 활용하기

정리 1. 저장 프로시저의 의미와 작성 방법 1. 저장 프로시저란? 1.1 이용할 수 있는 버전 저장 프로시저를 학습하기 전에 MySQL의 버전을 확인하도록 합니다. 저장 프로시저는 MySQL 버전 5.0 이상에

recoveryman.tistory.com

 

이글은 보고 또 봐야지.. 뒤에는 다 안해봄!

 

 

 

 

728x90
728x90

https://stepby-yun.tistory.com/185

 

mysql 이자액 계산기 식 만들기 (값 띄우기select,넣기insert,삭제TRUNCATE)

목표 년 이자 4프로를 12개월로 나눠서 매월 찍히는걸로 하는건데 이름은 그대로 입금날짜는 한달씩 증가로 찍혀야함!! 이자율 계산 INSERT INTO test.sequence (interest_amount) SELECT (deposit_amount ..

stepby-yun.tistory.com

 

지난시간..

복잡한 식을 깔끔하게 만들어주고자 변수를 사용해봤다.

 

 

(찾아보니까 declare(타입선언)랑 set(변수할당)있었는데 어째서인제 declare은 자꾸 빨간선뜸.

변수 설정할때 @이름 으로 씀)

 

use test;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',now(),'10000000');

set @lastDate = (select deposit_date from sequence order by id desc limit 1) ;
set @initial_amount = (select deposit_amount from sequence where id='1');
set @name = (select name from sequence where id='1');


INSERT INTO sequence (name,deposit_date,interest_amount)
select @name,
 (select date_add(@lastDate,INTERVAL 1 MONTH)),
@initial_amount* 0.04 /12;

 

 

 

하.지.만.

 

 

마지막 행 날짜값에다가 한달씩 더해야되는데 

자꾸 첫번째 행값에 더했다.

 

 

 

 

 

예상했던대로 변수 재할당 다시 해야만 

마지막 값을 가져왔다. 허허...

 

어떻게 해결할 것인가~ 

 

 

 

만약에 행이 추가되면 변수 재할당으로 해야하나????

???

 

 

 

 

728x90

+ Recent posts