/ Hex Artifact Content
Login

Artifact fb8a2ba83746c7fdfd9e52fa7f6aaf5c422b8246:


0000: 23 0a 23 20 52 75 6e 20 74 68 69 73 20 54 63 6c  #.# Run this Tcl
0010: 20 73 63 72 69 70 74 20 74 6f 20 67 65 6e 65 72   script to gener
0020: 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ate the constrai
0030: 6e 74 2e 68 74 6d 6c 20 66 69 6c 65 2e 0a 23 0a  nt.html file..#.
0040: 73 65 74 20 72 63 73 69 64 20 7b 24 49 64 3a 20  set rcsid {$Id: 
0050: 63 6f 6e 66 6c 69 63 74 2e 74 63 6c 2c 76 20 31  conflict.tcl,v 1
0060: 2e 33 20 32 30 30 34 2f 30 35 2f 33 31 20 31 35  .3 2004/05/31 15
0070: 3a 30 36 3a 33 30 20 64 72 68 20 45 78 70 20 24  :06:30 drh Exp $
0080: 20 7d 0a 73 6f 75 72 63 65 20 63 6f 6d 6d 6f 6e   }.source common
0090: 2e 74 63 6c 0a 68 65 61 64 65 72 20 7b 43 6f 6e  .tcl.header {Con
00a0: 73 74 72 61 69 6e 74 20 43 6f 6e 66 6c 69 63 74  straint Conflict
00b0: 20 52 65 73 6f 6c 75 74 69 6f 6e 20 69 6e 20 53   Resolution in S
00c0: 51 4c 69 74 65 7d 0a 70 75 74 73 20 7b 0a 3c 68  QLite}.puts {.<h
00d0: 31 3e 43 6f 6e 73 74 72 61 69 6e 74 20 43 6f 6e  1>Constraint Con
00e0: 66 6c 69 63 74 20 52 65 73 6f 6c 75 74 69 6f 6e  flict Resolution
00f0: 20 69 6e 20 53 51 4c 69 74 65 3c 2f 68 31 3e 0a   in SQLite</h1>.
0100: 0a 3c 70 3e 0a 49 6e 20 6d 6f 73 74 20 53 51 4c  .<p>.In most SQL
0110: 20 64 61 74 61 62 61 73 65 73 2c 20 69 66 20 79   databases, if y
0120: 6f 75 20 68 61 76 65 20 61 20 55 4e 49 51 55 45  ou have a UNIQUE
0130: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 0a 61   constraint on.a
0140: 20 74 61 62 6c 65 20 61 6e 64 20 79 6f 75 20 74   table and you t
0150: 72 79 20 74 6f 20 64 6f 20 61 6e 20 55 50 44 41  ry to do an UPDA
0160: 54 45 20 6f 72 20 49 4e 53 45 52 54 20 74 68 61  TE or INSERT tha
0170: 74 20 76 69 6f 6c 61 74 65 73 0a 74 68 65 20 63  t violates.the c
0180: 6f 6e 73 74 72 61 69 6e 74 2c 20 74 68 65 20 64  onstraint, the d
0190: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 62 6f  atabase will abo
01a0: 72 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  rt the operation
01b0: 20 69 6e 0a 70 72 6f 67 72 65 73 73 2c 20 62 61   in.progress, ba
01c0: 63 6b 20 6f 75 74 20 61 6e 79 20 70 72 69 6f 72  ck out any prior
01d0: 20 63 68 61 6e 67 65 73 20 61 73 73 6f 63 69 61   changes associa
01e0: 74 65 64 20 77 69 74 68 0a 55 50 44 41 54 45 20  ted with.UPDATE 
01f0: 6f 72 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e  or INSERT comman
0200: 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  d, and return an
0210: 20 65 72 72 6f 72 2e 0a 54 68 69 73 20 69 73 20   error..This is 
0220: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
0230: 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 2e 0a  vior of SQLite..
0240: 42 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  Beginning with v
0250: 65 72 73 69 6f 6e 20 32 2e 33 2e 30 2c 20 74 68  ersion 2.3.0, th
0260: 6f 75 67 68 2c 20 53 51 4c 69 74 65 20 61 6c 6c  ough, SQLite all
0270: 6f 77 73 20 79 6f 75 20 74 6f 0a 64 65 66 69 6e  ows you to.defin
0280: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 77 61  e alternative wa
0290: 79 73 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77  ys for dealing w
02a0: 69 74 68 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ith constraint v
02b0: 69 6f 6c 61 74 69 6f 6e 73 2e 0a 54 68 69 73 20  iolations..This 
02c0: 61 72 74 69 63 6c 65 20 64 65 73 63 72 69 62 65  article describe
02d0: 73 20 74 68 6f 73 65 20 61 6c 74 65 72 6e 61 74  s those alternat
02e0: 69 76 65 73 20 61 6e 64 20 68 6f 77 20 74 6f 20  ives and how to 
02f0: 75 73 65 20 74 68 65 6d 2e 0a 3c 2f 70 3e 0a 0a  use them..</p>..
0300: 3c 68 32 3e 43 6f 6e 66 6c 69 63 74 20 52 65 73  <h2>Conflict Res
0310: 6f 6c 75 74 69 6f 6e 20 41 6c 67 6f 72 69 74 68  olution Algorith
0320: 6d 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 53 51 4c  ms</h2>..<p>.SQL
0330: 69 74 65 20 64 65 66 69 6e 65 73 20 66 69 76 65  ite defines five
0340: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66   constraint conf
0350: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
0360: 61 6c 67 6f 72 69 74 68 6d 73 0a 61 73 20 66 6f  algorithms.as fo
0370: 6c 6c 6f 77 73 3a 0a 3c 2f 70 3e 0a 0a 3c 64 6c  llows:.</p>..<dl
0380: 3e 0a 3c 64 74 3e 3c 62 3e 52 4f 4c 4c 42 41 43  >.<dt><b>ROLLBAC
0390: 4b 3c 2f 62 3e 3c 2f 64 74 3e 0a 3c 64 64 3e 3c  K</b></dt>.<dd><
03a0: 70 3e 57 68 65 6e 20 61 20 63 6f 6e 73 74 72 61  p>When a constra
03b0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 63  int violation oc
03c0: 63 75 72 73 2c 20 61 6e 20 69 6d 6d 65 64 69 61  curs, an immedia
03d0: 74 65 20 52 4f 4c 4c 42 41 43 4b 0a 6f 63 63 75  te ROLLBACK.occu
03e0: 72 73 2c 20 74 68 75 73 20 65 6e 64 69 6e 67 20  rs, thus ending 
03f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
0400: 73 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65  saction, and the
0410: 20 63 6f 6d 6d 61 6e 64 20 61 62 6f 72 74 73 0a   command aborts.
0420: 77 69 74 68 20 61 20 72 65 74 75 72 6e 20 63 6f  with a return co
0430: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e  de of SQLITE_CON
0440: 53 54 52 41 49 4e 54 2e 20 20 49 66 20 6e 6f 20  STRAINT.  If no 
0450: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 61  transaction is.a
0460: 63 74 69 76 65 20 28 6f 74 68 65 72 20 74 68 61  ctive (other tha
0470: 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20 74 72  n the implied tr
0480: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 69  ansaction that i
0490: 73 20 63 72 65 61 74 65 64 20 6f 6e 20 65 76 65  s created on eve
04a0: 72 79 0a 63 6f 6d 6d 61 6e 64 29 20 74 68 65 6e  ry.command) then
04b0: 20 74 68 69 73 20 61 6c 67 6f 72 69 74 68 6d 20   this algorithm 
04c0: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61  works the same a
04d0: 73 20 41 42 4f 52 54 2e 3c 2f 70 3e 3c 2f 64 64  s ABORT.</p></dd
04e0: 3e 0a 0a 3c 64 74 3e 3c 62 3e 41 42 4f 52 54 3c  >..<dt><b>ABORT<
04f0: 2f 62 3e 3c 2f 64 74 3e 0a 3c 64 64 3e 3c 70 3e  /b></dt>.<dd><p>
0500: 57 68 65 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e  When a constrain
0510: 74 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 63 63 75  t violation occu
0520: 72 73 2c 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rs, the command 
0530: 62 61 63 6b 73 20 6f 75 74 0a 61 6e 79 20 70 72  backs out.any pr
0540: 69 6f 72 20 63 68 61 6e 67 65 73 20 69 74 20 6d  ior changes it m
0550: 69 67 68 74 20 68 61 76 65 20 6d 61 64 65 20 61  ight have made a
0560: 6e 64 20 61 62 6f 72 74 73 20 77 69 74 68 20 61  nd aborts with a
0570: 20 72 65 74 75 72 6e 20 63 6f 64 65 0a 6f 66 20   return code.of 
0580: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
0590: 54 2e 20 20 42 75 74 20 6e 6f 20 52 4f 4c 4c 42  T.  But no ROLLB
05a0: 41 43 4b 20 69 73 20 65 78 65 63 75 74 65 64 20  ACK is executed 
05b0: 73 6f 20 63 68 61 6e 67 65 73 0a 66 72 6f 6d 20  so changes.from 
05c0: 70 72 69 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 77  prior commands w
05d0: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 74  ithin the same t
05e0: 72 61 6e 73 61 63 74 69 6f 6e 0a 61 72 65 20 70  ransaction.are p
05f0: 72 65 73 65 72 76 65 64 2e 20 20 54 68 69 73 20  reserved.  This 
0600: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 62  is the default b
0610: 65 68 61 76 69 6f 72 20 66 6f 72 20 53 51 4c 69  ehavior for SQLi
0620: 74 65 2e 3c 2f 70 3e 3c 2f 64 64 3e 0a 0a 3c 64  te.</p></dd>..<d
0630: 74 3e 3c 62 3e 46 41 49 4c 3c 2f 62 3e 3c 2f 64  t><b>FAIL</b></d
0640: 74 3e 0a 3c 64 64 3e 3c 70 3e 57 68 65 6e 20 61  t>.<dd><p>When a
0650: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
0660: 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 20 74 68  ation occurs, th
0670: 65 20 63 6f 6d 6d 61 6e 64 20 61 62 6f 72 74 73  e command aborts
0680: 20 77 69 74 68 20 61 0a 72 65 74 75 72 6e 20 63   with a.return c
0690: 6f 64 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ode SQLITE_CONST
06a0: 52 41 49 4e 54 2e 20 20 42 75 74 20 61 6e 79 20  RAINT.  But any 
06b0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
06c0: 61 74 61 62 61 73 65 20 74 68 61 74 0a 74 68 65  atabase that.the
06d0: 20 63 6f 6d 6d 61 6e 64 20 6d 61 64 65 20 70 72   command made pr
06e0: 69 6f 72 20 74 6f 20 65 6e 63 6f 75 6e 74 65 72  ior to encounter
06f0: 69 6e 67 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ing the constrai
0700: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 0a 61 72 65  nt violation.are
0710: 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 61   preserved and a
0720: 72 65 20 6e 6f 74 20 62 61 63 6b 65 64 20 6f 75  re not backed ou
0730: 74 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  t.  For example,
0740: 20 69 66 20 61 6e 20 55 50 44 41 54 45 0a 73 74   if an UPDATE.st
0750: 61 74 65 6d 65 6e 74 20 65 6e 63 6f 75 6e 74 65  atement encounte
0760: 72 65 64 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  red a constraint
0770: 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 6e 20 74 68   violation on th
0780: 65 20 31 30 30 74 68 20 72 6f 77 20 74 68 61 74  e 100th row that
0790: 0a 69 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .it attempts to 
07a0: 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74 68 65  update, then the
07b0: 20 66 69 72 73 74 20 39 39 20 72 6f 77 20 63 68   first 99 row ch
07c0: 61 6e 67 65 73 20 61 72 65 20 70 72 65 73 65 72  anges are preser
07d0: 76 65 64 0a 62 79 20 63 68 61 6e 67 65 20 74 6f  ved.by change to
07e0: 20 72 6f 77 73 20 31 30 30 20 61 6e 64 20 62 65   rows 100 and be
07f0: 79 6f 6e 64 20 6e 65 76 65 72 20 6f 63 63 75 72  yond never occur
0800: 2e 3c 2f 70 3e 3c 2f 64 64 3e 0a 0a 3c 64 74 3e  .</p></dd>..<dt>
0810: 3c 62 3e 49 47 4e 4f 52 45 3c 2f 62 3e 3c 2f 64  <b>IGNORE</b></d
0820: 74 3e 0a 3c 64 64 3e 3c 70 3e 57 68 65 6e 20 61  t>.<dd><p>When a
0830: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
0840: 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 20 74 68  ation occurs, th
0850: 65 20 6f 6e 65 20 72 6f 77 20 74 68 61 74 20 63  e one row that c
0860: 6f 6e 74 61 69 6e 73 0a 74 68 65 20 63 6f 6e 73  ontains.the cons
0870: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
0880: 20 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64   is not inserted
0890: 20 6f 72 20 63 68 61 6e 67 65 64 2e 20 20 42 75   or changed.  Bu
08a0: 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0a 63 6f  t the command.co
08b0: 6e 74 69 6e 75 65 73 20 65 78 65 63 75 74 69 6e  ntinues executin
08c0: 67 20 6e 6f 72 6d 61 6c 6c 79 2e 20 20 4f 74 68  g normally.  Oth
08d0: 65 72 20 72 6f 77 73 20 62 65 66 6f 72 65 20 61  er rows before a
08e0: 6e 64 20 61 66 74 65 72 20 74 68 65 20 72 6f 77  nd after the row
08f0: 20 74 68 61 74 0a 63 6f 6e 74 61 69 6e 65 64 20   that.contained 
0900: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  the constraint v
0910: 69 6f 6c 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  iolation continu
0920: 65 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  e to be inserted
0930: 20 6f 72 20 75 70 64 61 74 65 64 0a 6e 6f 72 6d   or updated.norm
0940: 61 6c 6c 79 2e 20 20 4e 6f 20 65 72 72 6f 72 20  ally.  No error 
0950: 69 73 20 72 65 74 75 72 6e 65 64 2e 3c 2f 70 3e  is returned.</p>
0960: 3c 2f 64 64 3e 0a 0a 3c 64 74 3e 3c 62 3e 52 45  </dd>..<dt><b>RE
0970: 50 4c 41 43 45 3c 2f 62 3e 3c 2f 64 74 3e 0a 3c  PLACE</b></dt>.<
0980: 64 64 3e 3c 70 3e 57 68 65 6e 20 61 20 55 4e 49  dd><p>When a UNI
0990: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  QUE constraint v
09a0: 69 6f 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c  iolation occurs,
09b0: 20 74 68 65 20 70 72 65 2d 65 78 69 73 74 69 6e   the pre-existin
09c0: 67 20 72 6f 77 0a 74 68 61 74 20 63 61 75 73 65  g row.that cause
09d0: 64 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  d the constraint
09e0: 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 72 65   violation is re
09f0: 6d 6f 76 65 64 20 70 72 69 6f 72 20 74 6f 20 69  moved prior to i
0a00: 6e 73 65 72 74 69 6e 67 0a 6f 72 20 75 70 64 61  nserting.or upda
0a10: 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
0a20: 20 72 6f 77 2e 20 20 54 68 75 73 20 74 68 65 20   row.  Thus the 
0a30: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
0a40: 20 61 6c 77 61 79 73 20 6f 63 63 75 72 73 2e 0a   always occurs..
0a50: 54 68 65 20 63 6f 6d 6d 61 6e 64 20 63 6f 6e 74  The command cont
0a60: 69 6e 75 65 73 20 65 78 65 63 75 74 69 6e 67 20  inues executing 
0a70: 6e 6f 72 6d 61 6c 6c 79 2e 20 20 4e 6f 20 65 72  normally.  No er
0a80: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
0a90: 3c 2f 70 3e 3c 2f 64 64 3e 0a 3c 2f 64 6c 3e 0a  </p></dd>.</dl>.
0aa0: 0a 3c 68 32 3e 57 68 79 20 53 6f 20 4d 61 6e 79  .<h2>Why So Many
0ab0: 20 43 68 6f 69 63 65 73 3f 3c 2f 68 32 3e 0a 0a   Choices?</h2>..
0ac0: 3c 70 3e 53 51 4c 69 74 65 20 70 72 6f 76 69 64  <p>SQLite provid
0ad0: 65 73 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 66  es multiple conf
0ae0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
0af0: 61 6c 67 6f 72 69 74 68 6d 73 20 66 6f 72 20 61  algorithms for a
0b00: 0a 63 6f 75 70 6c 65 20 6f 66 20 72 65 61 73 6f  .couple of reaso
0b10: 6e 73 2e 20 20 46 69 72 73 74 2c 20 53 51 4c 69  ns.  First, SQLi
0b20: 74 65 20 74 72 69 65 73 20 74 6f 20 62 65 20 72  te tries to be r
0b30: 6f 75 67 68 6c 79 20 63 6f 6d 70 61 74 69 62 6c  oughly compatibl
0b40: 65 20 77 69 74 68 20 61 73 0a 6d 61 6e 79 20 6f  e with as.many o
0b50: 74 68 65 72 20 53 51 4c 20 64 61 74 61 62 61 73  ther SQL databas
0b60: 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 2c 20  es as possible, 
0b70: 62 75 74 20 64 69 66 66 65 72 65 6e 74 20 53 51  but different SQ
0b80: 4c 20 64 61 74 61 62 61 73 65 0a 65 6e 67 69 6e  L database.engin
0b90: 65 73 20 65 78 68 69 62 69 74 20 64 69 66 66 65  es exhibit diffe
0ba0: 72 65 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65  rent conflict re
0bb0: 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
0bc0: 69 65 73 2e 20 20 46 6f 72 0a 65 78 61 6d 70 6c  ies.  For.exampl
0bd0: 65 2c 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6c  e, PostgreSQL al
0be0: 77 61 79 73 20 75 73 65 73 20 52 4f 4c 4c 42 41  ways uses ROLLBA
0bf0: 43 4b 2c 20 4f 72 61 63 6c 65 20 61 6c 77 61 79  CK, Oracle alway
0c00: 73 20 75 73 65 73 20 41 42 4f 52 54 2c 20 61 6e  s uses ABORT, an
0c10: 64 0a 4d 79 53 51 4c 20 75 73 75 61 6c 6c 79 20  d.MySQL usually 
0c20: 75 73 65 73 20 46 41 49 4c 20 62 75 74 20 63 61  uses FAIL but ca
0c30: 6e 20 62 65 20 69 6e 73 74 72 75 63 74 65 64 20  n be instructed 
0c40: 74 6f 20 75 73 65 20 49 47 4e 4f 52 45 20 6f 72  to use IGNORE or
0c50: 20 52 45 50 4c 41 43 45 2e 0a 42 79 20 73 75 70   REPLACE..By sup
0c60: 70 6f 72 74 69 6e 67 20 61 6c 6c 20 66 69 76 65  porting all five
0c70: 20 61 6c 74 65 72 6e 61 74 69 76 65 73 2c 20 53   alternatives, S
0c80: 51 4c 69 74 65 20 70 72 6f 76 69 64 65 73 20 6d  QLite provides m
0c90: 61 78 69 6d 75 6d 0a 70 6f 72 74 61 62 69 6c 69  aximum.portabili
0ca0: 74 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 6e 6f 74  ty.</p>..<p>Anot
0cb0: 68 65 72 20 72 65 61 73 6f 6e 20 66 6f 72 20 73  her reason for s
0cc0: 75 70 70 6f 72 69 6e 67 20 6d 75 6c 74 69 70 6c  upporing multipl
0cd0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 69 73 20  e algorithms is 
0ce0: 74 68 61 74 20 73 6f 6d 65 74 69 6d 65 73 0a 69  that sometimes.i
0cf0: 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 75  t is useful to u
0d00: 73 65 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20  se an algorithm 
0d10: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
0d20: 65 66 61 75 6c 74 2e 0a 53 75 70 70 6f 73 65 2c  efault..Suppose,
0d30: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 79 6f   for example, yo
0d40: 75 20 61 72 65 0a 69 6e 73 65 72 74 69 6e 67 20  u are.inserting 
0d50: 31 30 30 30 20 72 65 63 6f 72 64 73 20 69 6e 74  1000 records int
0d60: 6f 20 61 20 64 61 74 61 62 61 73 65 2c 20 61 6c  o a database, al
0d70: 6c 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c  l within a singl
0d80: 65 0a 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e.transaction, b
0d90: 75 74 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ut one of those 
0da0: 72 65 63 6f 72 64 73 20 69 73 20 6d 61 6c 66 6f  records is malfo
0db0: 72 6d 65 64 20 61 6e 64 20 63 61 75 73 65 73 0a  rmed and causes.
0dc0: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72  a constraint err
0dd0: 6f 72 2e 20 20 55 6e 64 65 72 20 50 6f 73 74 67  or.  Under Postg
0de0: 72 65 53 51 4c 20 6f 72 20 4f 72 61 63 6c 65 2c  reSQL or Oracle,
0df0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0a 31 30 30   none of the.100
0e00: 30 20 72 65 63 6f 72 64 73 20 77 6f 75 6c 64 20  0 records would 
0e10: 67 65 74 20 69 6e 73 65 72 74 65 64 2e 20 20 49  get inserted.  I
0e20: 6e 20 4d 79 53 51 4c 2c 20 73 6f 6d 65 20 73 75  n MySQL, some su
0e30: 62 73 65 74 20 6f 66 20 74 68 65 0a 72 65 63 6f  bset of the.reco
0e40: 72 64 73 20 74 68 61 74 20 61 70 70 65 61 72 65  rds that appeare
0e50: 64 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61 6c  d before the mal
0e60: 66 6f 72 6d 65 64 20 72 65 63 6f 72 64 20 77 6f  formed record wo
0e70: 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 0a  uld be inserted.
0e80: 62 75 74 20 74 68 65 20 72 65 73 74 20 77 6f 75  but the rest wou
0e90: 6c 64 20 6e 6f 74 2e 20 20 4e 65 69 74 68 65 72  ld not.  Neither
0ea0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 65 73 70   behavior is esp
0eb0: 65 69 63 61 6c 6c 79 20 68 65 6c 70 66 75 6c 2e  eically helpful.
0ec0: 0a 57 68 61 74 20 79 6f 75 20 72 65 61 6c 6c 79  .What you really
0ed0: 20 77 61 6e 74 20 69 73 20 74 6f 20 75 73 65 20   want is to use 
0ee0: 74 68 65 20 49 47 4e 4f 52 45 20 61 6c 67 6f 72  the IGNORE algor
0ef0: 69 74 68 6d 20 74 6f 20 69 6e 73 65 72 74 0a 61  ithm to insert.a
0f00: 6c 6c 20 62 75 74 20 74 68 65 20 6d 61 6c 66 6f  ll but the malfo
0f10: 72 6d 65 64 20 72 65 63 6f 72 64 2e 3c 2f 70 3e  rmed record.</p>
0f20: 0a 0a 7d 0a 66 6f 6f 74 65 72 20 24 72 63 73 69  ..}.footer $rcsi
0f30: 64 0a                                            d.