Q&A

  • Insert 쿼리에서...
엑세스 mdb에 상품테이블, 고객테이블, 판매 테이블이 있습니다.
판매테이블은 상품과 고객의 코드로 FOREIGN KEY 관계가 있으며, 판매테이블에서 상품코드와 고객코드는 null 값 가능으로 설정 되어있습니다.

질문은..
  with query1 do
  begin
    close;
    sql.clear;
    sql.add('   insert into 판매                         '
              +'   (판매코드, 상품코드, 고객코드)    '
              +'    values                                    '
              +'   (:판매코드, :상품코드, :고객코드) ';
    paramsbyname('판매코드').asstring := 판매코드값;
    paramsbyname('상품코드').asstring := 상품코드값;
    paramsbyname('고객코드').asstring := 고객코드값;
    ExecSql;
  end;
위 실행에서 상품코드나 고객코드의 값이 빈문자열('') 이라면
"Key violation 고객 테이블에 관련 레코드가 필요하기 때문에 레코드를
추가하거나 변경할 수 없습니다."
라고.. 뜨네요.
위 문장에서 상품코드나 고객코드 필드를 아예 없애고 삽입을 하면
그러니까.. 고객코드가 빈문자열일시..
  sql.add('   insert into 판매                         '
              +'   (판매코드, 상품코드)    '
              +'    values                                    '
              +'   (:판매코드, :상품코드) ';
로 하면 잘 실행이 됩니다.
테이블을 쿼리로 열고 업데이트 컴포를 쓸때도 업데이트 컴포의 쿼리로
아무 문제가 없이 잘 되는데.. 어쩨.. 직접 쿼리로 Execsql을 하니
에러가 걸리는지..
델파이 버젼은 6 이고, 패치 1, 2 전부 해준 상태입니다.
고수님들 답변 꼭 부탁드립니다.

참고로.. 판매테이블의 생성쿼리는 아래와 같고, 문제의 필드는
ch_code, c_code 입니다.

CREATE TABLE MarketingM2003
(
mk_date TEXT(10) NOT NULL,
mk_cnt SMALLINT NOT NULL,
ch_code TEXT(5) NULL,
c_code TEXT(10) NULL,
mk_pointbigo TEXT(30) NULL,
mk_point1 INTEGER NULL,
mk_point2 INTEGER NULL,
mk_point3 REAL NULL,
mk_OldPrice MONEY NULL,
mk_pointsale INTEGER NULL,
mk_Price MONEY NULL,
sw_code TEXT(3) NULL
, CONSTRAINT PK_MarketingM2003 PRIMARY KEY (mk_date, mk_cnt)
, CONSTRAINT FK_MarketingM2003_TO_charge FOREIGN KEY (ch_code)
      REFERENCES charge (ch_code)
, CONSTRAINT FK_MarketingM2003_TO_customer FOREIGN KEY (c_code)
      REFERENCES customer (c_code)
, CONSTRAINT FK_MarketingM2003_TO_sale_way FOREIGN KEY (sw_code)
      REFERENCES sale_way (sw_code)
);
3  COMMENTS
  • Profile
    DelChoBo 2003.03.13 05:44

    윗 질문과 차이는 없습니다만.. 엑세스에서 실제 아래 테이블로 실행을 해보니
    insert into MarketingM2003
    (mk_date, mk_cnt, ch_code, c_code, mk_pointbigo)
    values
    ('1', 1, null, null, '')
    하면 입력이 잘되는데..
    insert into MarketingM2003
    (mk_date, mk_cnt, ch_code, c_code, mk_pointbigo)
    values
    ('1', 1, null, '', '')
    로 실행을 하면 에러가 나네요.. 엑세스에서 null과 ''을 차이를 두는건지..
    c_code는 널 허용이면서 외래키로 연결된 필그이고, mk_pointbigo는 그냥 널 허용인 필드인데... 왜 차이가 나는건지.. 헐...
    아시느분 꼭좀 답변 부탁드립니다.
  • Profile
    임옥섭 2003.03.13 19:59
    액세스 도움말에.. 이렇게 되어 있군요.

    "Microsoft Access에서는 빈 값을 Null 값과 빈 문자열 두 가지 종류로 구분합니다. 빈 값은 정보가 존재하기는 하지만 현재는 알 수 없는 경우를 나타내거나 필드가 특정 레코드에 적용되지 않는 경우를 나타내기도 합니다. "

    오라클기준으로 ''와 NULL은 동일한데
    액세스는 다른듯.. 아마도.. 위의 CREATE 문상으로 보았을때는
    ch_code와 c_code가 모두 NULL이 가능하도록 되어있는듯 하지만
    둘다.. foreign키므로.. 참조테이블에 c_code는 아마 null 값이 아니라
    ''만 있는듯합니다.
    확인해볼려면 오라클은 nvl()이란 함수가 있는데 액세스는 뭔지 모르겠군요

    즐코하시길.
  • Profile
    DelChoBo 2003.03.14 02:26