home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 October A / Pcwk10a98.iso / Inprise / TRIAL / INTRBASE / DATA.Z / TABLES.SQL < prev    next >
Text File  |  1998-03-15  |  9KB  |  305 lines

  1. /*
  2.     THIS FILE IS FOR USE WITH THE TUTORIAL IN "GETTING STARTED",
  3.     IT IS NOT MEANT TO BE USED WITHOUT REFERRING TO THE MANUAL.
  4.  
  5. *   You must change the parameters below to match your
  6. *   server name, database name , username, and password.
  7. *   This file defines tables for the EMPLOYEE database.
  8. */
  9.  
  10. CONNECT "server:\dir\mydb.gdb"
  11. USER "USERNAME" PASSWORD "password";
  12.  
  13. /*
  14. * You are supposed to create the COUNTRY table by hand.
  15. * CREATE TABLE country
  16. * (
  17. *     country COUNTRYNAME NOT NULL PRIMARY KEY,
  18. *     currency VARCHAR(10) NOT NULL)
  19. */
  20.  
  21. CREATE TABLE department
  22. (
  23.     dept_no         DEPTNO NOT NULL,
  24.     department      VARCHAR(25) NOT NULL UNIQUE,
  25.     head_dept       DEPTNO,
  26.     mngr_no         EMPNO,
  27.     budget          BUDGET,
  28.     location        VARCHAR(15),
  29.     phone_no        PHONENUMBER DEFAULT '555-1234',
  30.  
  31.     PRIMARY KEY (dept_no),
  32.     FOREIGN KEY (head_dept) REFERENCES department (dept_no)
  33. );
  34. COMMIT;
  35.  
  36. CREATE DESCENDING INDEX budgetx ON department (budget);
  37.  
  38. /*  Create JOB Table.
  39.  *  Job id, job title, minimum and maximum salary, job description,
  40.  *  and required languages.
  41.  *
  42.  *  A job is defined by a multiple key, consisting of a job_code
  43.  *  (a 5-letter job abbreviation), a job grade, and a country name
  44.  *  indicating the salary currency type.
  45.  *
  46.  *  The salary range is expressed in the appropriate country's currency.
  47.  *
  48.  *  The job requirement is a text blob.
  49.  *
  50.  *  The job may also require some knowledge of foreign languages,
  51.  *  stored in a character array.
  52.  */
  53.  
  54. CREATE TABLE JOB (JOB_CODE JOBCODE NOT NULL,
  55.     JOB_GRADE JOBGRADE NOT NULL,
  56.     JOB_COUNTRY COUNTRYNAME NOT NULL,
  57.     JOB_TITLE VARCHAR(25) NOT NULL,
  58.     MIN_SALARY SALARY NOT NULL,
  59.     MAX_SALARY SALARY NOT NULL,
  60.     JOB_REQUIREMENT BLOB SUB_TYPE TEXT SEGMENT SIZE 400,
  61.     LANGUAGE_REQ VARCHAR(15)[1:5] ,
  62.     PRIMARY KEY (JOB_CODE, JOB_GRADE, JOB_COUNTRY),
  63.     FOREIGN KEY (job_country) REFERENCES country (country),
  64.     CHECK (min_salary < max_salary) );
  65. COMMIT;
  66.  
  67. /*  Create EMPLOYEE Table
  68.  *  Employee id, name, phone extension, date of hire, department id,
  69.  *  job and salary information.
  70.  *
  71.  *  Salary can be entered in any country's currency.
  72.  *  Therefore, some of the salaries can appear magnitudes larger than others,
  73.  *  depending on the currency type.  Ex. Italian lira vs. U.K. pound.
  74.  *  The currency type is determined by the country code.
  75.  *
  76.  *  job_code, job_grade, and job_country reference employee's job information,
  77.  *  illustrating two tables related by referential constraints on multiple
  78.  *  columns.
  79.  *
  80.  *  The employee salary is verified to be in the correct salary range
  81.  *  for the given job title.
  82.  */
  83.  
  84. CREATE TABLE employee
  85. (
  86.     emp_no          EMPNO NOT NULL PRIMARY KEY,
  87.     first_name      FIRSTNAME NOT NULL,
  88.     last_name       LASTNAME NOT NULL,
  89.     phone_ext       VARCHAR(4),
  90.     hire_date       DATE DEFAULT 'NOW' NOT NULL,
  91.     dept_no         DEPTNO NOT NULL,
  92.     job_code        JOBCODE NOT NULL,
  93.     job_grade       JOBGRADE NOT NULL,
  94.     job_country     COUNTRYNAME NOT NULL,
  95.     salary          SALARY NOT NULL,
  96.     full_name       COMPUTED BY (last_name || ', ' || first_name),
  97.  
  98.     FOREIGN KEY (dept_no) 
  99.         REFERENCES department (dept_no),
  100.     FOREIGN KEY (job_code, job_grade, job_country) 
  101.         REFERENCES job (job_code, job_grade, job_country),
  102.  
  103.     CHECK ( salary >= (SELECT min_salary FROM job WHERE
  104.                         job.job_code = employee.job_code AND
  105.                         job.job_grade = employee.job_grade AND
  106.                         job.job_country = employee.job_country) AND
  107.             salary <= (SELECT max_salary FROM job WHERE
  108.                         job.job_code = employee.job_code AND
  109.                         job.job_grade = employee.job_grade AND
  110.                         job.job_country = employee.job_country))
  111. );
  112.  
  113. CREATE INDEX namex ON employee (last_name, first_name);
  114. COMMIT;
  115.  
  116. /*
  117.  *  Project id, project name, description, project team leader,
  118.  *  and product type.
  119.  *
  120.  *  Project description is a text blob.
  121.  */
  122.  
  123. CREATE TABLE project
  124. (
  125.     proj_id         PROJNO NOT NULL,
  126.     proj_name       VARCHAR(20) NOT NULL UNIQUE,
  127.     proj_desc       BLOB(800,1),
  128.     team_leader     EMPNO,
  129.     product         PRODTYPE,
  130.  
  131.     PRIMARY KEY (proj_id),
  132.     FOREIGN KEY (team_leader) REFERENCES employee (emp_no)
  133. );
  134. COMMIT;
  135.  
  136. /*
  137.  *  Employee id, project id, employee's project duties.
  138.  *
  139.  *  Employee duties is a text blob.
  140.  */
  141.  
  142. CREATE TABLE employee_project
  143. (
  144.     emp_no          EMPNO NOT NULL,
  145.     proj_id         PROJNO NOT NULL,
  146.  
  147.     PRIMARY KEY (emp_no, proj_id),
  148.     FOREIGN KEY (emp_no) REFERENCES employee (emp_no),
  149.     FOREIGN KEY (proj_id) REFERENCES project (proj_id)
  150. );
  151. COMMIT;
  152.  
  153. /*
  154.  *  Fiscal year, project id, department id, projected head count by
  155.  *  fiscal quarter, projected budget.
  156.  *
  157.  *  Tracks head count and budget planning by project by department.
  158.  *
  159.  *  Quarterly head count is an array of integers.
  160.  */
  161.  
  162. CREATE TABLE proj_dept_budget
  163. (
  164.     year                INTEGER NOT NULL CHECK (YEAR >= 1993),
  165.     proj_id             PROJNO NOT NULL,
  166.     dept_no             DEPTNO NOT NULL,
  167.     quart_head_cnt      INTEGER [4],
  168.     projected_budget    BUDGET,
  169.  
  170.     PRIMARY KEY (year, proj_id, dept_no),
  171.     FOREIGN KEY (dept_no) REFERENCES department (dept_no),
  172.     FOREIGN KEY (proj_id) REFERENCES project (proj_id)
  173. );
  174. COMMIT;
  175.  
  176. /*
  177.  *  Employee number, salary change date, updater's user id, old salary,
  178.  *  and percent change between old and new salary.
  179.  */
  180.  
  181. CREATE TABLE salary_history
  182. (
  183.     emp_no              EMPNO NOT NULL,
  184.     change_date         DATE DEFAULT 'NOW' NOT NULL,
  185.     updater_id          VARCHAR(20) NOT NULL,
  186.     old_salary          SALARY NOT NULL,
  187.     percent_change      DOUBLE PRECISION
  188.                             DEFAULT 0
  189.                             NOT NULL
  190.                             CHECK (percent_change between -50 and 50),
  191.     new_salary          COMPUTED BY
  192.                             (old_salary + old_salary * percent_change / 100),
  193.  
  194.     PRIMARY KEY (emp_no, change_date, updater_id),
  195.     FOREIGN KEY (emp_no) REFERENCES employee (emp_no)
  196. );
  197.  
  198. CREATE INDEX updaterx ON salary_history (updater_id);
  199. CREATE DESCENDING INDEX changex ON salary_history (change_date);
  200. COMMIT;
  201.  
  202. /*
  203.  *  Customer id, customer name, contact first and last names,
  204.  *  phone number, address lines, city, state or province, country,
  205.  *  postal code or zip code, and customer status.
  206.  */
  207.  
  208. CREATE TABLE customer
  209. (
  210.     cust_no             CUSTNO NOT NULL,
  211.     customer            VARCHAR(25) NOT NULL,
  212.     contact_first       FIRSTNAME,
  213.     contact_last        LASTNAME,
  214.     phone_no            PHONENUMBER,
  215.     address_line1       ADDRESSLINE,
  216.     address_line2       ADDRESSLINE,
  217.     city                VARCHAR(25),
  218.     state_province      VARCHAR(15),
  219.     country             COUNTRYNAME,
  220.     postal_code         VARCHAR(12),
  221.     on_hold             CHAR DEFAULT NULL
  222.         CHECK (on_hold IS NULL OR on_hold = '*'),
  223.     PRIMARY KEY (cust_no),
  224.         FOREIGN KEY (country) 
  225.     REFERENCES country (country)
  226. );
  227.  
  228. CREATE INDEX custnamex ON customer (customer);
  229. CREATE INDEX custregion ON customer (country, city);
  230. COMMIT;
  231.  
  232. /*
  233.  *  Purchase order number, customer id, sales representative, order status,
  234.  *  order date, date shipped, date need to ship by, payment received flag,
  235.  *  quantity ordered, total order value, type of product ordered,
  236.  *  any percent discount offered.
  237.  *
  238.  *  Tracks customer orders.
  239.  *
  240.  *  sales_rep is the ID of the employee handling the sale.
  241.  *
  242.  *  Number of days passed since the order date is a computed field.
  243.  *
  244.  *  Several checks are performed on this table, among them:
  245.  *      - A sale order must have a status: open, shipped, waiting.
  246.  *      - The ship date must be entered, if order status is 'shipped'.
  247.  *      - New orders can't be shipped to customers with 'on_hold' status.
  248.  *      - Sales rep
  249.  */
  250.  
  251. CREATE TABLE sales
  252. (
  253.     po_number       PONUMBER NOT NULL,
  254.     cust_no         CUSTNO NOT NULL,
  255.     sales_rep       EMPNO,
  256.     order_status    VARCHAR(7)
  257.                         DEFAULT 'new'
  258.                         NOT NULL
  259.                         CHECK (order_status in
  260.                             ('new', 'open', 'shipped', 'waiting')),
  261.     order_date      DATE
  262.                         DEFAULT 'now'
  263.                         NOT NULL,
  264.     ship_date       DATE
  265.                         CHECK (ship_date >= order_date OR ship_date IS NULL),
  266.     date_needed     DATE
  267.                         CHECK (date_needed > order_date OR date_needed IS NULL),
  268.     paid            CHAR
  269.                         DEFAULT 'n'
  270.                         CHECK (paid in ('y', 'n')),
  271.     qty_ordered     INTEGER
  272.                         DEFAULT 1
  273.                         NOT NULL
  274.                         CHECK (qty_ordered >= 1),
  275.     total_value     DECIMAL(9,2)
  276.                         NOT NULL
  277.                         CHECK (total_value >= 0),
  278.     discount        FLOAT
  279.                         DEFAULT 0
  280.                         NOT NULL
  281.                         CHECK (discount >= 0 AND discount <= 1),
  282.     item_type       PRODTYPE,
  283.     aged            COMPUTED BY
  284.                         (ship_date - order_date),
  285.  
  286.     PRIMARY KEY (po_number),
  287.     FOREIGN KEY (cust_no) REFERENCES customer (cust_no),
  288.     FOREIGN KEY (sales_rep) REFERENCES employee (emp_no),
  289.  
  290.     CHECK (NOT (order_status = 'shipped' AND ship_date IS NULL)),
  291.  
  292.     CHECK (NOT (order_status = 'shipped' AND
  293.             EXISTS (SELECT on_hold FROM customer
  294.                     WHERE customer.cust_no = sales.cust_no
  295.                     AND customer.on_hold = '*')))
  296. );
  297.  
  298. CREATE INDEX needx ON sales (date_needed);
  299. CREATE INDEX salestatx ON sales (order_status, paid);
  300. CREATE DESCENDING INDEX qtyx ON sales (item_type, qty_ordered);
  301. COMMIT;
  302. EXIT;
  303.