>Description:
When updating a table after it has been selected with a LEFT JOIN, some
UPDATE queries execute normally without actually updating the data, unless the
data to be updated is selected normally first.
This script is written in mod_perl, using DBI::mysql to connect to the
database. The following are the tables referenced by the query:
mysql> desc dealer;
+----------------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+----------------+
| dealer_id | int(8) | | PRI | NULL | auto_increment |
| dealer_code | varchar(5) | | | | |
| group_id | int(8) | | | 0 | |
| emp_id | int(8) | | | 0 | |
| address_id | int(8) | | | 0 | |
| dealer_name | varchar(200) | | | | |
| dealer_state | int(8) | | | 0 | |
| dealer_zip | varchar(5) | | | | |
| dealer_contact_fname | varchar(100) | YES | | NULL | |
| dealer_contact_lname | varchar(100) | YES | | NULL | |
| dealer_URL | varchar(200) | YES | | NULL | |
| dealer_email | varchar(100) | YES | | NULL | |
| dealer_password | varchar(100) | YES | | NULL | |
| dealer_ph1 | varchar(25) | YES | | NULL | |
| dealer_ph2 | varchar(25) | YES | | NULL | |
| dealer_fax | varchar(25) | YES | | NULL | |
| active | enum('Y','N') | | | N | |
+----------------------+---------------+------+-----+---------+----------------+
17 rows in set (0.00 sec)
mysql> desc dealer_lead_method;
+-------------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------------+------+-----+---------+-------+
| dealer_id | int(8) | | PRI | 0 | |
| method_id | tinyint(4) | | PRI | 0 | |
| method_parameters | text | YES | | NULL | |
+-------------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> desc tlkp_dealer_lead_method;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| method_id | tinyint(4) | | PRI | NULL | auto_increment |
| method_name | varchar(50) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> desc tlkp_address;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| address_id | int(8) | | PRI | NULL | auto_increment |
| export | int(8) | | | 0 | |
| address_addr_1 | varchar(200) | YES | | NULL | |
| address_addr_2 | varchar(200) | YES | | NULL | |
| address_city | varchar(200) | YES | | NULL | |
| address_state | int(8) | | | 0 | |
| address_zip | varchar(5) | YES | | NULL | |
| address_plus4 | varchar(4) | YES | | NULL | |
| cdate | int(8) | | | 0 | |
+----------------+--------------+------+-----+---------+----------------+
9 rows in set (0.01 sec)
mysql> desc tlkp_state;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| state_id | int(8) | | PRI | NULL | auto_increment |
| state_abbr | char(2) | YES | | NULL | |
| state_name | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
The select with join:
my $q = "SELECT * FROM dealer, tlkp_address, tlkp_state LEFT JOIN
dealer_lead_method ON dealer.dealer_id = dealer_lead_method.dealer_id LEFT JOIN
tlkp_dealer_lead_method ON dealer_lead_method.method_id =
tlkp_dealer_lead_method.method_id WHERE dealer.dealer_id = $dealer_id AND
dealer.address_id = tlkp_address.address_id AND tlkp_address.address_state =
tlkp_state.state_id";
And the updates that are run:
UPDATE dealer_lead_method SET method_parameters = '[EMAIL PROTECTED]' WHERE
dealer_id = 2 AND method_id = 1
UPDATE dealer_lead_method SET method_parameters = '(414) 271-1814' WHERE
dealer_id = 2 AND method_id = 2
>How-To-Repeat:
I have been unable to repeat this in the mysql monitor.
>Fix:
The updates execute normally if I SELECT * FROM dealer_lead_method WHERE
dealer_id = 2 before updating any records for that dealer_id
>Submitter-Id: <submitter ID>
>Originator: nick edward purvis
>Organization:
CarSpot.com
>MySQL support: none
>Synopsis: UPDATE fails after select w/JOIN
>Severity: non-critical
>Priority: low
>Category: mysql
>Class: sw-bug
>Release: mysql-3.23.34a (Source distribution)
>Environment:
System: FreeBSD xtabi.carspot.com 4.2-RELEASE FreeBSD 4.2-RELEASE #3: Mon Apr 2
11:10:40 CDT 2001 [EMAIL PROTECTED]:/usr/src/sys/compile/XTABI i386
Some paths: /usr/bin/perl /usr/bin/make /usr/local/bin/gmake /usr/bin/gcc /usr/bin/cc
GCC: Using builtin specs.
gcc version 2.95.2 19991024 (release)
Compilation info: CC='cc' CFLAGS='-O -pipe' CXX='c++' CXXFLAGS='-O -pipe
-felide-constructors -fno-rtti -fno-exceptions' LDFLAGS=''
LIBC:
-r--r--r-- 1 root wheel 1169076 Nov 20 2000 /usr/lib/libc.a
lrwxrwxrwx 1 root wheel 9 Mar 13 12:02 /usr/lib/libc.so -> libc.so.4
-r--r--r-- 1 root wheel 559196 Nov 20 2000 /usr/lib/libc.so.4
Configure command: ./configure --localstatedir=/var/db/mysql --without-perl
--without-debug --without-readline --without-bench --with-mit-threads=no
--with-libwrap --with-low-memory --enable-assembler --with-berkeley-db
--prefix=/usr/local i386--freebsd4.2
Perl: This is perl, version 5.005_03 built for i386-freebsd
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php