2008. 8. 27. 17:55

Chap 13. 무결성 제약 조건

데이터 무결성 제약 조건(data integrity constraint rule) 이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 여러가지 규칙을 말합니다.
데이터 무결성 제약 조건은 데이터베이스 설계 단계에서 데이터의 정확성을 유지하기 위해서 다양한 규칙을 고려하여 테이블을 생성할 때 표현하게 됩니다.

무결성 제약 조건

역할

NOT NULL

해당 컬럼 값으로 NULL을 허용하지 않음

UNIQUE

테이블 내에서 해당 컬럼 값은 항상 유일무이한 값을 가질 것

PRIMARY KEY

해당 컬럼 값은 반드시 존재해야 하고 유일해야 한다는 조건
즉, NOT NULL 조건과 UNIQUE 조건을 결합한 형태

FOREIGN KEY

해당 컬럼의 값이 타컬럼의 값을 참조해야만 함
즉, 참조되는 컬럼에 없는 값은 입력 불가함

CHECK

해당 컬럼에 저장 가능한 데이터 값의 범위나 사용자 조건을 지정


기본 키(PRIMARY KEY) 제약 조건 : 기본 키는 테이블 내의 해당 행을 다른 행과 구분할 수 있도록 하는 식별 기능을 가진 가장 대표적인 컬럼으로 NULL 값이나 중복되는 값을 가질 수 없습니다.

무결성 제약 조건에는 컬럼 레벨 정의 방법과 테이블 레벨 정의 방법이 있습니다.
컬럼 레벨 정의 방법은 아래에서 보듯이 테이블을 정의할 때 컬럼내에서 제약조건(기본키)을 정의하는 것을 말합니다.
create table dept02
(deptno number(2) constraint dept02_deptno_pk primary key,
dname varchar2(15),
loc varchar2(15));
일반적으로 제약조건을 지정할 때는 constraint dept02_deptno_pk 제약조건 테이블명_컬럼명_제약조건 유형 의 형태로 기술합니다.

테이블 레벨 정의 방법은 주로 하나의 컬럼에 여러개의 제약조건을 부여할 경우 사용되며
아래에서 보듯이 컬럼 정의를 먼저 내리고 따로 생성된 컬럼에 대한 제약조건을 지정하는 것을 말합니다.
이때 주의하실 사항은 not null 조건은 테이블 레벨 정의 방법으로는 지정할 수 없습니다. 
create table dept02
(deptno number(02),
dname varchar2(15),
loc varchar(15),
constraint dept02_deptno_pk primary key(deptno));

제약 조건 확인하기
select constraint_name, constraint_table from user_constraints;
// 해당 유저의 제약조건을 전부 검색

제약 조건 변경하기
조건 변경은 이미 생성된 테이블을 변경하는 것이므로 alter table 문을 이용해야 합니다.

제약조건 추가 시
alter table dept02
add constraint dept03_deptno_fk foreign key(deptno);
제약 조건 제거 시
alter table dept02
drop constraint dept03_deptno_fk ;

제약 조건 타입

constraint_type

의미

P

PRIMARY KEY

R

FOREIGN KEY

U

UNIQUE

C

CHECK, NOT NULL


부모 테이블과 자식 테이블
주체가 되는 테이블을 부모 테이블이라 하며 관계가 능동형으로 표현된다
주체 관계가 모호한 경우에는 어느 테이블의 데이터가 먼저 정의되어야 하는가를 기준으로 부모테이블과 자식테이블을 나눈다.

부자관계의 테이블에서는 부모테이블의 기본키가 자식테이블의 외래키가 되어야한다.
2008. 8. 27. 16:39

Chap 11. 트랜잭션 관리

트랜잭션(transaction)이란 SQL 명령문들을 하나의 논리적인 작업 단위로 처리하는 것을 말하며, 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구시키기 위해 도입되었다.
트랜잭션은 하나 또는 여러개의 DML(Data Manipulation Language)명령 (INSERT, UPDATE, DELETE)을 모두 묶어 놓은 하나의 논리적인 작업 단위를 의미합니다.

트랜잭션 제어를 위한 명령어에는
COMMIT : 트랜잭션이 발생하는 경우 새롭게 생성되거나 갱신된 데이터들이 물리적으로 영구히 저장되는 것을 의미합니다.
일단 COMMIT이 실행되면 다시 복구할 수 있는 방법은 없습니다.
ROLLBACK : 이전 상태로 다시 돌아가도록 함으로서 지금까지 수행했던 데이터베이스의 변경을 모두 무효화하겠다는 의미를 갖습니다.
즉, DML 트랜잭션이 실행되고 나서 DML 트랜잭션이 COMMIT 되기 전에는 언제든지 트랜잭션이 발생하기 전 상태로 되돌아갈 수 있습니다.
SAVEPOINT : 여러 개의 SQL문의 실행을 수반하는 트랜잭션의 경우, 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 수 있으며, 세이브포인트는 롤백과 함께 사용해서 현재 트랜잭션 내의 특정 세이브포인트까지 롤백합니다.

자동 커밋 : DDL(Data Definition Language - CREATE, ALTER, DROP, RENAME, TRUNCATE)문은 자동으로 COMMIT이 발생합니다.
DDL문은 실행 중에 에러가 발생하여 제대로 실행되지 않았어도 자동으로 COMMIT이 실행됩니다.

특정 세이브포인트까지 작업을 되돌릴 때의 유의 사항
(세이브포인트)
 A           B           C           D
--------------------------------------------
| IUD        |    IU     |    IUN    |     IU     |
--------------------------------------------
                           <---------------------

C 지점으로 롤백하기 위해서 다음과 같은 문장을 실행합니다.
SQL>ROLLBACK TO  C;
그 후에 D지점으로 롤백하기 위해서 다음과 같은 문장을 실행한다면 어떻게 될까요?
SQL>ROLLBACK TO  D;
D지점으로 롤백 하는 명령어는 실행할 수 없습니다. ROLLBACK TO  C;를 수행함으로써 그 다음 세이브포인트인 D의 위치도 사라지기 때문입니다.

2008. 8. 27. 16:19

Part 6. AWT - III 윈도우창에 메뉴바와 메뉴 만들기

===================================================================================
CardLayout을 통한 메인
===================================================================================
package pack01;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements ActionListener{
 CardLayout card;
 MenuItem mi01, mi02, mi03, mi04, mi05;
 public void actionPerformed(ActionEvent e) {
  Object menu=e.getSource();
  if(menu == mi01 || menu == mi02 || menu == mi03 ){
  card.show(this, e.getActionCommand());
  }
  else if(menu==mi04){
   CalcDialog dlg=new CalcDialog();
  }
  else if(menu==mi05){
   AboutDialog adlg=new AboutDialog(this);
  }
 }
 FrameTest(){
  card=new CardLayout();
  Panel p01=new CusPanel();
  Panel p02=new VideoPanel();
  Panel p03=new RentPanel();  
  // 패널을 프레임에 추가하되 배치관리자가 CardLayout일 경우에는 이름을 주어야 한다.
  setLayout(card);
  add(p01,"고객 관리");
  add(p02,"비디오 관리");
  add(p03,"대여 관리");  
  card.show(this, "대여관리");
  MenuBar mb=new MenuBar();
  setMenuBar(mb);  
  Menu m01=new Menu("비디오 대여관리");
  mb.add(m01);
  Menu m02=new Menu("도움말");
  mb.add(m02);
  mi01=new MenuItem("고객 관리");
  m01.add(mi01);
  mi02=new MenuItem("비디오 관리");
  m01.add(mi02);
  mi03=new MenuItem("대여 관리");
  m01.add(mi03);
  mi04=new MenuItem("계산기");
  m02.add(mi04);
  mi05=new MenuItem("about 비디오관리");  
  m02.add(mi05);
  mi01.addActionListener(this);
  mi02.addActionListener(this);
  mi03.addActionListener(this);
  mi04.addActionListener(this);
  mi05.addActionListener(this);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
고객관리 CusPanel.java, 비디오관리 VideoPanel, 대여관리 RentPanel
===================================================================================
package pack01;
import java.awt.Label;
import java.awt.Panel;
public class CusPanel extends Panel {
 CusPanel(){
  add(new Label("고객 관리"));
 }
}

package pack01;
import java.awt.Label;
import java.awt.Panel;
public class VideoPanel extends Panel{
 VideoPanel(){
 add(new Label("비디오 관리"));
 }
}

package pack01;
import java.awt.Label;
import java.awt.Panel;
public class RentPanel extends Panel{
 RentPanel(){
  add(new Label("대여관리"));
 }
}
===================================================================================
도움말 메뉴 - 계산기
===================================================================================
package pack01;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CalcDialog extends Dialog {
 CalcDialog(){
  super(new Frame());
  setSize(200,100);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent e) {
    dispose();
   }  
  }
  );
 }
}
===================================================================================
도움말 메뉴 - about 비디오관리
===================================================================================
package pack01;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class AboutDialog extends Dialog {
 FrameTest fe;
 public AboutDialog(FrameTest fe) {
  super(fe);
  this.fe = fe;
  setSize(200,100);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent e) {
    dispose();
   }  
  }
  );
 }
}
===================================================================================