> I have worked up an SQL script that needs expansion into two > different scripts to take care of two different needs. They can be > worked from one table, the 'species' file while the second will > probably need the species file to have a join to the sci_genus file. > > First, perhaps I should put a few words in for those that have never > been exposed to botanical species and genera. All living things are > given botanical names by scientific convention. Each unique living > thing (from bacteria to fish to animals, plants and trees) are assigned > a unique two part name called the species name. Wood comes from > trees (of course) so the wood is also referred often by the tree's > scientific name. > > The first word in a species name happens to be the name of the next > and higher organizational level above it, the genus. If you have a species > name, you are therefore able to extract the genus name. (genus is singular, > genera is plural, species is oddly singular and plural all the time > by the way). Here are some examples: > > Species Name Genus name > Abies Alba Abies > Acacia farnesiana Acacia > Caesalpinia ebano Caesalpinia > Dalbergia oliveri Dalbergia > Santalum album Santalum > > Problem 1 > My pet project, a wood knowledge base is reporting over 15,000 > botanical names of woods from > around the world. The database is called 'taxa'. information on all > wood species is kept in a table > called 'species'. Within the 18 fields in that one file, two relevant > fields included are 'species_name' > (which records all scientific species names and 'genus_name' which > holds all genus names. > > Note again that from the same file (no JOIN needed), every genus name > can be read inside each > species name (as above). Unfortunately, the genera (plural of genus) > column is missing 1/4 or > more of the names it should have for every record of a species ( > genera to species is a one to > many relationship). To extract all the needed data to insert to the > blank cells, I was able to put > together the following script (using phpadmin) that lists nicely on > the screen all the genera from > extracting them from all the species names: > > SELECT LEFT(`species_name`, LOCATE(' ', `species_name`)-1) > FROM species_backup > WHERE `genus_name` IS NULL > > note --- I used a copy of species I names species_backup to protect > the original file while > experimenting to see what will work out. > > So far so good. Now all I should have to do is have the proper syntax > for a INSERT INTO > statement to write all the missing genera names and repair a fair > size chunk of errors (missing > data). Here is what I tried; > > INSERT INTO species_backup ('genus_name') > SELECT LEFT(`species_name`, LOCATE(' ', `species_name`)-1) > FROM species_backup > WHERE `genus_name` IS NULL > > I got the following error: #1062 - Duplicate entry '' for key 2 > > What did I do wrong? I must be close. What is the proper syntax that will > work?
You have an index (at least two) on columns in your table. At least one of them specifies that contents of the column must be unique (presumably on the 'genus_name' column as it's the only one changed). The server is complaining that a second, identical value is being added. SHOW INDEX FROM species_backup will show you information on the indexes for your table. The index on genus_name has to have the 'non_unique' column set to 1/true. > Once this runs ok, the missing data problem will be sold. I may, > though, work it > later into a short PHP script pointed to by a menu link for > occasional maintenance > of the website and its data. > > Problem 2 > Go to http://www.prowebcanada.com/taxa/ and choose Woody Orders from > the menu on the left. > It will show all the Orders that I have found have woody elements in > them. Pick one and > you will travel down the botanical tree to show the data sheet on the > chosen order. > Below that on the page will be all the woody Families that belong > under the chosen Order. > Choose one and .... we continue to work our way down the botanical > tree further until > a chosen Genus data page lists all woody Species under a Genus, we > pick one and end up > at the bottom of the tree and the data page for the chosen Species. > > In other words, downward travel in the tree works quite well. After > some prior attempts, > I want to also get the upward path of child to parent relationships > finally working and > finished). There are three paths needed to complete the entire upward > travel means: > Child to Parent > Species to Genus > Genus to Family > Family to Order > > The last two I am quite sure will need a JOIN statement between the > relevant child table > and the parent table while, as shown above, the genus name can be > extracted directly out > of the species name. That should be easier. Lets leave the last two > for some other day. > > If you are on a species data page, the parameter species_name will be > in memory since > it had to be chosen at some stage to get there. A typical sample of > the link from a species listing to the one chosen species can be seen > by resting a mouse on one choice in the > listing of species, (using a GET statement) such as: > > http://www.prowebcanada.com/taxa/displayspecies.php?species_name=Acacia > albida > > The above first script works well to list ALL genera, but all I need > is the parent genus > for the child (for example above, the parent Genus for Acacia > albida). So what kind of statement can best do that? Once this works, > I can place it in a link statement so it is > possible to move not only down the tree but for the first time UP the > botanical tree one > level to a parent genus. (.... leaving only two more paths to develop > for complete upward > mobility). > > I have an uncomfortable feeling that this should be a rather > elementary part of learning > PHP and MySQL. Please bear with me if it is. I have tried > combinations earlier this year > only to be faced with errors I could not handle. > > You may wish to separate these two tasks into separate responses for ease of > discussion and handling. > > These are two problems left of a short list of tasks in the project > before I can lay coding aside for a few months to concentrate on a > massive, huge amount of data input. It would > be nice if I got them all done as soon as possible to start the year > with data input instead. > > Your help(s) always much appreciated, > Season's greetings and Merry Christmas, > > Bill Mudry > Mississauga, Ontario Canada > > > > > > -- Niel Archer -- PHP Windows Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php