반응형

[MariaDB] 마리아DB PHP - PHP 내장 함수 (MySQL)

 

PHP 주요 내장함수

함수명 사용법 설명
date( ) date("포맷") 지정한 포맷으로 날짜를 반환. Y는 연도, m은 월, j는 일, h는 시를 의미함.
max( ), min( )  max(배열 or 숫자), min(배열 or 숫자) 최대값, 최소값 반환.
pi( ) pi( ) 파이 값을 반환. M_PI 상수와 동일함.
round( ), ceil( ) round(숫자), ceil(숫자) 소수점 아래를 반올림, 올림.
trim( ) trim(문자열) 문자열 양쪽 공백을 제거.
strlen() strlen(문자열) 문자열의 길이를 반환.
str_repeat( ) str_repeat(문자열, 횟수) 문자열을 횟수만큼 반복.
str_replace( ) str_replace(old, new, target) target 문자열에서 old를 new로 변환.
str_split( ) str_split(문자열, 길이) 문자열을 길이만큼 잘라서 배열로 분리. 길이를 생략하면 1로 간주함.
explode( ) explode(구분자, 문자열) 문자열을 구분자로 분리해서 배열로  저장.
implode( ) implode(배열, 구분자) 배열을 중간에 구분자를 넣어서, 하나의 문자 열로 이어줌.
htmlspecialchars( ) htmlspecialchars(HTML코드) HTML 코드를 해석하지 ㅇ낳고 그대로 웹 브라우저에 표현.

 

내장 함수 활용 예제

<?php
   $today = "현재는 ".date("Y-m-j")." 입니다.";
   echo $today, "<br>";
   // 현재는 년도-월-일 입니다. (현재 날짜 출력)
   
   $ary = array(100, 50, 200, 7);
   echo "최대:", max($ary) ," 최소:", min(-123, 50, 999), "<br>";
   // 최대:200 최소:-123 (출력)
   
   echo pi(), " ", round(M_PI), " ",ceil(M_PI), "<br>";
   // 3.1415926535898 3 4 (출력)
   
   $str = "   I am MariaDB   "; // 앞뒤에 공백 3개씩.
   $str = trim($str);
   echo "#", $str, "#", "<br>";
   // #I am MariaDB# (출력)
   
   echo "문자열 길이:", strlen($str), "<br>";
   // 문자열 길이: 12 (출력. 띄어쓰기도 길이로 들어감.)
   
   echo str_repeat("-", 30), "<br>";
   // ------------------------------ (- 30번 출력)
   
   echo str_replace( "MariaDB", "마리아디비", "I am MariaDB"), "<br>";
   // I am 마리아디비 (출력. 1번인자 값을 3번인자 값에서 찾아 2번 값으로 교체.)
   
   $ary = str_split("I am MariaDB", 3);
   print_r($ary); echo "<br>"; // 배열을 출력한다.
   echo "<br>";
   //Array ([0] => I a [1] => m M [2] => ari [3] => aDB) (출력)
   
   $ary = explode(" ", "I am MariaDB");
   print_r($ary); echo "<br>";// 배열을 출력한다.
   // Array([0] => I [1] => am [2] => MaraiDB) (출력)
   
   echo implode($ary, " "), "<br>";
   // I am MariaDB (출력)
   
   $myHTML = "<A href='www.hanbit.co.kr'> 한빛미디어 </A> <br>";
   echo $myHTML;
   // 한빛미디어 (출력. 앵커태그 링크가 걸림.)
   echo htmlspecialchars($myHTML);  
   // <A href='www.hanbit.co.kr'> 한빛미디어 </A> <br> (출력. 태그가 모두 문자로 출력.)
 ?>

 

MariaDB or MySQL 관련 내장 함수

함수명 설명
mysqli_connect( ) MariaDB or MySQL 서버에 연결.
mysqli_connect_error( ) MariaDB or MySQL 서버에 연결 오류가 발생 시에 그 원인을 알려줌.
mysqli_close( ) MariaDB or MySQL 서버에 연결된 것을 종료.
mysqli_select_db( ) 사용할 데이터베이스를 지정함.
mysqli_query( ) SQL문을 서버에서 실행.
mysqli_error( ) SQL문이 서버에서 실패한 경우 그 원인을 알려줌.
mysqli_num_rows( ) SELECT 문의 결과가 몇 개의 행인지 알려줌
mysqli_fetch_array( ) SELECT 문의 실행 결과에서 결과 행을 추출함.

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB PHP - PHP 조건문과 반복문, 배열 (MySQL)

 

if( ) 함수

// 형식
if(조건식) {
	// 참일때 실행 코드
} else {
		// 거짓일 때 실행 코드
}



// 예제
<?php
   $a=100;
   $b=200;
   
   if($a > $b) {
	   echo "a가 b보다 큽니다.";
   } else {
	   echo "a가 b보다 작습니다.";
   }
 ?>
 // a가 b보다 큽니다 (출력)
 
 
 
 // if~elseif~else 예제
 <?php
   $jumsu=83;
   
   if($jumsu >= 90) {
	   echo "A학점";
   } elseif($jumsu >= 80) {
	   echo "B학점";
   } elseif($jumsu >= 70) {
	   echo "C학점";
   } elseif($jumsu >= 60) {
	   echo "D학점";
   } else {
	   echo "F학점";
   }
 ?>
 // B학점 (출력)

 

switch( ) 함수

// 형식
switch(변수) {
	case 값1 :
    	// 변수 = 값1 일때 실행되는 코드
        break;
    case 값2 :
    	// 변수 = 값2 일때 실행되는 코드
        break;
    ...
    default:
    	// 변수와 case 값이 같은 경우가 없을 때 실행되는 코드
}



// 예제
<?php
   $jumsu=83;
   
   switch(intval($jumsu / 10)) { // 변수 jumsu를 10으로 나눠서 앞자리를 값으로 함
		case 10:
		case 9:
			echo "A학점"; break;
		case 8:
			echo "B학점"; break;
		case 7:
			echo "C학점"; break;
		case 6:
			echo "D학점"; break;			
	    default:
			echo "F학점";
   }
 ?>
 // B학점 (출력)

 

for( ) 함수

// 형식
for(초기값 ; 조건식 ; 증감식 ) {
	// 반복되는 코드 입력
}



// 예제 1
<?php
   for( $i=1; $i<=10 ; $i=$i+1 ) {
	   echo $i, " ";
   }
?>
// 1 2 3 4 5 6 7 8 9 10 (출력)



// 예제 2
<?php
   $hap=0;
   
   for( $i=123; $i<=456 ; $i=$i+2 ) { // 123부터 2씩 증가하여 457이 되면 빠져나감(455까지 아래 코드실행)
	  $hap = $hap + $i;
   }
   
   echo "123부터 456까지 홀수의 합계 : ", $hap;
 ?>
 // 123부터 456까지 홀수의 합계: 48263 (출력)

 

while( ) 함수

// 형식 1
while(조건식) {
	// 반복될 코드 입력
}



// 형식 2
초기값;
while(조건식) {
	// 반복될 코드 입력
    증감식;
}



// 예제
<?php
   $hap=0;	//hap 변수 선언
   
   $i=123;
   while( $i<=456 ) {
	  $hap = $hap + $i;	// hap변수에 i값을 누적시킴
	   $i=$i+2;	// i를 2씩 증가시킴
   }
   
   echo "123부터 456까지 홀수의 합계 : ", $hap;
 ?>
 // 123부터 456까지 홀수의 합계 : 48263 (출력)

 

배열

// 형식
$배열A = array(값1, 값2, 값3 ...);

$배열B = range(시작값, 끝값, 증가값);	// 증가값은 생략이 가능함

$배열C[0] = 값1;	// "$배열C"로 앞서 정의되어 있지 않아도 바로 배열이 생성됨
$배열C[1] = 값2;
$배열C[2] = 값3;



// 예제 1
<?php
  $myArray = array(100, 'MariaDB', 123.123);
  echo $myArray[0], " ", $myArray[1], " ", $myArray[2], "<br>";
  
  $myArray = range(1,3);
  echo $myArray[0], " ", $myArray[1], " ", $myArray[2], "<br>";
  
  $myArray = range(1,10,2);
  echo $myArray[0], " ", $myArray[4], "<br>";
  
  $newArray[0] = 'I';
  $newArray[1] = 'am';
  $newArray[2] = 'MariaDB';
  echo $newArray[0], " ", $newArray[1], " ", $newArray[2], "<br>";  
 ?>
 /*
 100 MariaDB 123.123
 1 2 3
 1 9
 I am MariaDB (출력)
 */
 
 
 
 // 예제 2
 <?php
  $hap = 0;
  $myArray = range(1,10);	// 변수에 1~10 값을 배열로 입력
 
  for($i=0; $i<10; $i++) {
     $hap = $hap + $myArray[$i];	//hap 변수에 myArray 배열 값들을 0~9까지 입력
  }
   echo "배열의 합계 : " , $hap;  
?>
// 배열의 합계 : 55 (출력)



// 예제 3
<?php
  $myArray = range(1,10);	// 변수에 1~10 값을 배열로 입력
  
  echo "임의로 섞은 값 ==> ";
  shuffle($myArray);	// 배열을 셔플(섞음)
  foreach($myArray as $data)	// foreach(배열명 as 변수) -> 배열의 값을 차례대로 하나씩 변수에 넣어서 반복
	echo $data, " ";
	
  echo "<br>오름차순 정렬 ==> ";	
  sort($myArray);	// 배열을 소트(정렬, 오름차순)
  foreach($myArray as $data)
	echo $data, " ";

  echo "<br>내림차순 정렬 ==> ";	
  rsort($myArray);	// 배열을 반대로소트(정렬, 내림차순)
  foreach($myArray as $data)
	echo $data, " ";
  
  echo "<br>순서를 반대로 ==> ";	
  $revArray = array_reverse($myArray);	// 배열의 순서를 역순으로 
  foreach($revArray as $data)
	echo $data, " ";	
?>
/*
 임의로 섞은 값 ==> 임의로 나옴
 오름차순 정렬 ==> 1 2 3 4 5 6 7 8 9 10
 내림차순 정렬 ==> 10 9 8 7 6 5 4 3 2 1
 순서를 반대로 ==> 1 2 3 4 5 6 7 8 9 10 (출력)
*/

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB PHP - PHP 기본 문법 (MySQL)

 

PHP 기본 구조 및 주석

/* php 기본 틀 */
<?php
  // 이 부분에 PHP 문법 코딩
?>



/* php 주석 */
<?php
 // 한 줄 주석용
 /*
   여러 줄
   주석용
 */
?>

 

변수와 데이터 형식

/* 변수와 출력 */
<?php
  $a = 100;
  print $a;
  
  $b = "안녕하세요? MariaDB";
  echo $b;
?>
// 100안녕하세요? MariaDB (출력)



/* 변수의 데이터 형식 */
<?php
 $a = 123;		echo gettype($a), "<br>";
 $a = 123.123; 	echo gettype($a), "<br>";
 $a = "MySQL";	echo gettype($a), "<br>";
 $a = true;		echo gettype($a), "<br>";
 $a = array( 1, 2, 3); echo gettype($a), "<br>";
?>
/*
integer
double
string
boolean
array (출력)
*/

 

문자열 ('...',   "...",   "...'~'..." )

<?php
   $str1 = "MariaDB<br>";   echo $str1;
   $str2 = 'PHP 프로그래밍<br>';   echo $str2;
   $str3 = "SELECT * FROM userTBL WHERE userID='AAA' ";   echo $str3;
?>
/*
MariaDB
PHP 프로그래밍
SELECT * FROM userTBL WHERE userID='AAA' (출력)
*/

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB PHP - XAMPP 설치하기 (MySQL)

 

PHP사용을 위해서는 아파치와 PHP 설치가 필요합니다. 이번 포스팅에서는 윈도우에서 PHP와 아파치를 사용할 수 있게 해주는 XAMPP에 대한 설치방법을 설명하겠습니다.

리눅스는 예전포스팅을 링크로 남겨두겠습니다. 참고 바랍니다.

 

라즈베리파이4 Apache 아파치 웹 서버 설치 (워드프레스 1편)

라즈베리파이4 Apache 아파치 웹 서버 설치 (워드프레스 1편) 워드프레스 설치를 위한 라즈베리파이에 Apache(아파치) 웹 서버 설치 방법입니다. Apache(아파치)는 웹 페이지를 제공 할 수 있도록 Raspber

reddb.tistory.com

 

라즈베리파이4 PHP 설치 (워드프레스 2편)

라즈베리파이4 PHP 설치 (워드프레스 2편) 워드프레스 설치를 위한 라즈베리파이에 PHP 설치 방법입니다. 앞선 포스팅에서 설명드린 Apache설치를 반드시 먼저 하시고 오시기 바랍니다. PHP는 정적 HT

reddb.tistory.com

 

먼저 XAMPP에 대해 간단히 설명드리겠습니다.

XAMPP는 크로스 플랫폼 웹 서버 자유 소프트웨어 꾸러미입니다.. 아파치 웹 서버(A), MariaDB(M), PHP(P), 펄(P)을 포함하고 있습니다. GNU 일반 공중 사용 허가서로 배포되며 자유롭고 쓰기 쉬운 웹 서버입니다.

 

설치를 위해 아래 사이트에서 자신의 O/S에 맞는 설치파일을 다운 받습니다.

 

XAMPP Installers and Downloads for Apache Friends

What is XAMPP? XAMPP is the most popular PHP development environment XAMPP is a completely free, easy to install Apache distribution containing MariaDB, PHP, and Perl. The XAMPP open source package has been set up to be incredibly easy to install and to us

www.apachefriends.org

XAMPP 다운로드

다른 버전을 받고 싶다면 상단에 다운로드를 누르고 자신이 필요한 버전으로 다운 받을 수 있습니다.

 

다운받은 실행파일을 실행하고 넥스트를 누릅니다.

 

원하는 프로그램을 선택하고 넥스트를 누릅니다.

 

설치 폴더는 기본폴더를 추천드립니다. 넥스트를 누릅니다.

 

언어는 영어인 상태로 넥스트를 누릅니다.

 

넥스트를 계속 누릅니다.

 

SETUP이 진행됩니다.

 

보안경고창이 뜨면 엑세스 허용을 클릭합니다. 아래 다른 경우에서 뜰 경우도 허용을 해야합니다.

 

설치가 완료되면 컨트롤 판네를 지금 열겠냐는 물음에 체크를 하고 피니쉬를 클릭합니다.

컨트롤 판넬이 시작되면 아파치와 DB를 스타트 합니다.

 

아파치와 DB가 실행되서 녹색이 되면 아파치의 Admin을 클릭합니다.

그러면 웹브라우저 창이 열리며 localhost/dashboard/로 연결을 합니다. 우측 상단에 phpMyAdmin을 클릭합니다.

 

웹브라우저가 http://localhost/phpmyadmin/로 연결되서 아래 페이지가 뜬다면 설치가 완료된 것 입니다.

다음은 C:\xampp\htdocs 위치로 이동합니다. 이 위치가 브라우저 주소창에 localhost/ 를 입력했을 때의 폴더입니다.

 

이 위치에서 메모장으로 php파일을 만듭니다.
만드는 방법은 파일형식을 모든파일(*.*)로 하시고 파일이름 끝에 확장자를 .php로 하신후 인코딩을 UTF-8로 C:\xampp\htdocs 폴더에 저장하시면 됩니다.
저는 info.php 라는 이름으로 파일을 만들고 아래 코드를 입력했습니다.

<?php
	phpinfo();
?>

 

이후 브라우저를 열고 localhost/info.php를 주소창에 입력했을 때 php 정보페이지가 뜨면 php가 정상 설치된 상태입니다.



[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 스토어드 프로그램 - 트리거 Trigger (MySQL)

 

스토어드 프로그램 종류는 4가지 입니다.

  1. 스토어드 프로시저 Stored Procedure
  2. 스토어드 함수 Stored Function
  3. 커서 Cursor
  4. 트리거 Trigger

이번 포스팅에서는 4번째인 트리거(Trigger)에 대해 설명하겠습니다.

트리거는 (1) AFTER 트리거, (2) BEFORE 트리거가 있습니다.

 

AFTER 트리거는 테이블에 INSERT, UPDATE, DELETE 등의 작업이 일어났을 때 작동하는 트리거 입니다. 작업이 이러난 후에 작동합니다.

BEFORE 트리거는 이벤트가 발생하기 전에 작동합니다. AFTER와 마찬가지로 INSERT, UPDATE, DELETE 이벤트로 작동합니다.

 

AFTER 트리거를 활용해 회원정보의 변경 또는 삭제 시 데이터를 백업하기

먼저  insert, update 작업이리 얼아나는 경우, 변경되기 전에 데이터를 저장할 테이블을 생성합니다.

USE testDB;
CREATE TABLE backup_userTBL -- 유저테이블의 변경전 내용을 저장할 테이블 생성
(	userID char(8) NOT NULL PRIMARY KEY,	-- ID를 기본키로 설정
	name VARCHAR(10) NOT NULL,
    birthYear int NOT NULL,
    addr char(2) NOT NULL
    mobile1 char(3),
    mobile2 char(8),
    height smallint,
    mDate date,
    modType char(2),	--  변경된 타입 저장할 컬럼. '수정' 또는 '삭제' 저장
    modDate date,	-- 변경된 날짜 저장할 컬럼.
    modUser varchar(256)	-- 변경한 사용자 저장할 컬럼
);

 

변경과 삭제가 발생할 때 작동하는 트리거를 userTBL에 부착합니다.

변경이 발생했을 때 작동하는 backupUserTbl_UpdateTRG 트리거를 작성합니다.

DROP TRIGGER IF EXISTS backUserTbl_UpdateTrg;	-- 트리거가 존재하면 삭제
DELIMITER //	-- 스토어드 프로그램 시작
CREATE TRIGGER backUserTbl_UpdateTrg  -- 트리거 생성
    AFTER UPDATE -- 변경 후에 작동하도록 지정
    ON userTBL -- 트리거를 userTBL 테이블에 부착
    FOR EACH ROW 
BEGIN	-- 실행하게될 코드 시작
    INSERT INTO backup_userTBL VALUES( OLD.userID, OLD.name, OLD.birthYear, 
        OLD.addr, OLD.mobile1, OLD.mobile2, OLD.height, OLD.mDate, 
        '수정', CURDATE(), CURRENT_USER() );	-- OLD. 테이블은 update나 delete가 실행되기 전 잠깐 데이터가 저장되는 임시 테이블
END // 	-- 코드 끝
DELIMITER ;	--스토어드 프로글램 끝

 

삭제가 발생했을 때 작동하는 backupUserTbl_DeleteTrg 트리거를 작성합니다.

DROP TRIGGER IF EXISTS backUserTbl_DeleteTrg;
DELIMITER //
CREATE TRIGGER backUserTbl_DeleteTrg  -- 트리거 생성
    AFTER DELETE -- 삭제 후에 작동하도록 지정
    ON userTBL -- 트리거를 userTBL 테이블에 부착
    FOR EACH ROW 
BEGIN
    INSERT INTO backup_userTBL VALUES( OLD.userID, OLD.name, OLD.birthYear, 
        OLD.addr, OLD.mobile1, OLD.mobile2, OLD.height, OLD.mDate, 
        '삭제', CURDATE(), CURRENT_USER() );
END //
DELIMITER ;

 

다음은 usetTBL 테이블에서 UPDATE와 DELETE를 해봅니다.

UPDATE userTBL SET addr = '서울' WHERE userID = 'AAA';
DELETE FROM userTBL WHERE height >= 180;

 

마지막으로 userTBL과 backup_userTBL 테이블을 조회하여 변경 된 사항을 확인합니다.

SELECT * FROM userTBL;	-- update, delete가 잘 실행되어 있음을 확인
SELECT * FROM backup_userTBL;	-- update, delete 된 데이터를 보관하고 mod값들도 정상 작동 확인

 

트리거가 생성하는 임시테이블(NEW, OLD)

트리거에서는 INSERT, UPDATE, DELETE 작업 수행시 임시로 사용되는 시스템 테이블 NEW, OLD가 있습니다.

 

먼저, NEW 테이블은 INSERT, UPDATE 작업 시 변경할 새로운 데이터를 잠깐 저장해 둡니다.

그 후에 NEW 테이블의 값을 변경하고자 했던 테이블에  입력, 변경하는 것 입니다.

그래서 NEW 테이블의 값을 조작하면 변경하고자 했던 테이블의 최종 입력, 변경하는 값을 새로운 값으로 변경할 수 있습니다.

INSERT(새 값) -> NEW테이블(새 값 입력) -> 변경하고자한 테이블(새 값 입력)

 

 

다음으로 OLD 테이블은 DELETE, UPDATE 작업이 수행될때 삭제, 변경되기 전에 예전 값을 임시 저장하는 테이블입니다.

DELETE(예전 값) -> 변경하고자한 테이블(예전 값 삭제) -> OLD테이블(예전 값 존재)

 

UPDATE의 경우 위에 NEW와 OLD가 모두 발생하게 됩니다.

UPDATE(새 값, 예전 값) -> NEW테이블(새 값 입력) -> 변경하고자한 테이블(예전값 삭제, 새값 입력) -> OLD테이블(예전 값 존재)

 

트리거의 작동 시에 새로 입력/변경되는 새로운 데이터를 참조하기 위해서는 NEW 테이블을 참조하고, 변경되기 전의 예전 데이터를 참조하기 위해서는 OLD 테이블을 참조하면 됩니다.

 

 

BEFORE 트리거를 활용해 생년이 잘못 입력시 생년을 수정하여 입력하기

USE testDB;
DROP TRIGGER IF EXISTS userTBL_BeforeInsertTrg;
DELIMITER // 
CREATE TRIGGER userTBL_BeforeInsertTrg  -- 트리거 생성
    BEFORE INSERT -- INSERT 전에 사용되도록 
    ON userTBL -- 트리거를 userTBL 테이블에 부착
    FOR EACH ROW 
BEGIN
    IF NEW.birthYear < 1900 THEN	-- NEW테이블의 생년 값이 1900년 미만으로 입력 시
        SET NEW.birthYear = 0;	-- NEW테이블의 생년 값을 0으로 설정
    ELSEIF NEW.birthYear > YEAR(CURDATE()) THEN	-- 또는, NEW테이블의 생년 값이 올해보다 초과할 때는
        SET NEW.birthYear = YEAR(CURDATE());	-- NEW테이블의 생년 값을 올해년도로 설정
    END IF;
END // 
DELIMITER ;

 

INSERT 두개를 실행하여 생년을 잘못 입력시 BEFORE 트리거가 잘 작동하는지 확인합니다.

INSERT INTO userTBL VALUES('BBB', '비비비', 1777, '부산', '011', '2222222', 191, '2020-10-01');	-- 1900년 미만 생년 트리거 발생시킴
INSERT INTO userTBL VALUES('CCC', '시시시', 2999, '대구', '011', '3333333', 161, '2010-2-20');	-- 올해보다 높은 생년 트리거 발생시킴

 

userTBL 테이블을 확인하여 트리거가 정상작동 한 INSERT 값이 입력 되었는지 확인해 봅니다.

SELECT * FROM userTBL;

 

 

트리거 확인 및 트리거 삭제 방법

SHOW TRIGGERS FROM DB명;	-- DB에 있는 트리거 보여줌

DROP TRIGGER 트리거명;	-- '트리거명' 트리거를 삭제

 

 

중첩트리거 활용하기

활용 시나리오

  1. 구매 테이블, 물품 테이블, 배송 테이블 3개의 테이블이 존재합니다.
  2. 고객이 물건을 구매 시 구매테이블에 값이 INSERT 됩니다.
  3. 구매테이블에 값이 INSERT 될 경우 -> 트리거로 물품테이블의 물품 남은 갯수를 수정시킵니다.(UPDATE)
  4. 물품테이블의 값이 UPDATE 될경우 -> 트리거로 배송테이블에 배송할 물품명과 물품갯수를 입력합니다.(INSERT)

먼저 테이블들을 생성합니다.

DROP DATABASE IF EXISTS testDB;	-- 만약 testDB DB가 존재한다면 삭제
CREATE DATABASE IF NOT EXISTS testDB;	-- testDB 생성

USE testDB;	--testDB 사용
CREATE TABLE orderTbl -- 구매 테이블 생성
	(orderNo INT AUTO_INCREMENT PRIMARY KEY, -- 구매 일련번호, 자동증가, 기본키
	 userID VARCHAR(5), -- 구매한 회원아이디
	 prodName VARCHAR(5), -- 구매한 물건명
	 orderamount INT );  -- 구매한 개수
    
CREATE TABLE prodTbl -- 물품 테이블 생성
	( prodName VARCHAR(5), -- 물건 이름
	  account INT ); -- 남은 물건수량
     
CREATE TABLE deliverTbl -- 배송 테이블 생성
	( deliverNo  INT AUTO_INCREMENT PRIMARY KEY, -- 배송 일련번호, 자동증가, 기본키
	  prodName VARCHAR(5), -- 배송할 물건명		  
	  account INT UNIQUE); -- 배송할 물건개수

 

물품테이블에 몇 가지 값을 입력합니다.

INSERT INTO prodTbl VALUES('냉장고', 999);
INSERT INTO prodTbl VALUES('TV', 999);
INSERT INTO prodTbl VALUES('세탁기', 999);

 

중첩트리거를 생성합니다.

-- 물품 테이블에서 개수를 감소시키는 트리거
DROP TRIGGER IF EXISTS orderTrg;	-- 트리거가 존재한다면 삭제
DELIMITER // 	-- 스토어드 프로그램 시작
CREATE TRIGGER orderTrg  -- 트리거 orderTrg 생성
    AFTER  INSERT 	-- 입력 후에 실행되도록 설정
    ON orderTBL -- 트리거를 orderTBL 테이블에 부착
    FOR EACH ROW 
BEGIN
    UPDATE prodTbl SET account = account - NEW.orderamount 	-- prodTbl 테이블의 account 값을 NEW테이블의 orderamount 값으로 빼서 저장
        WHERE prodName = NEW.prodName ;	-- prodName명이 NEW테이블의 prodName명과 같은 제품을 찾아서
END // 
DELIMITER ;


-- 배송테이블에 새 배송 건을 입력하는 트리거
DROP TRIGGER IF EXISTS prodTrg;
DELIMITER // 
CREATE TRIGGER prodTrg  -- 트리거 prodTrg 생성
    AFTER  UPDATE 	-- 수정 후에  실행되도록 설정
    ON prodTBL -- 트리거를 prodTBL 테이블에 부착
    FOR EACH ROW 
BEGIN
    DECLARE orderAmount INT;	-- 변수 orderAmount INT형으로 선언
    SET orderAmount = OLD.account - NEW.account;	-- 주문 개수 = (변경 전의 개수 - 변경 후의 개수)
    INSERT INTO deliverTbl(prodName, account)	-- deliverTbl테이블에 입력
        VALUES(NEW.prodName, orderAmount);	-- 입력값: NEW테이블의 제품명, 변수 orderAmount 값(주문개수)
END // 
DELIMITER ;

 

물건을 구매했다고 가정하고 주문테이블에 값을 입력해봅니다.

INSERT INTO orderTbl VALUES (NULL,'AAA', '냉장고', 5);

 

중첩트리거가 잘 작동했는지 테이블들을 확인합니다.

SELECT * FROM orderTbl;	-- 주문 INSERT가 입력되었는지 확인
SELECT * FROM prodTbl;	-- oserTBL 테이블 INSERT 이후에 트리거가 작동했는지 확인.
SELECT * FROM deliverTbl;	-- prodTBL 테이블 UPDATE 이후에 트리거가 작동했는지 확인.

 

만약 중첩트리거가 작동 중 마지막 트리거가 실패 할 경우 앞선 트리거들도 모두 롤백이 됩니다.

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형