Matt,

I am forwarding this to MySQL developers.

> Problem description:
> --------------------
> MySQL does not return key information about any column after the first
> in a unique multi-column key.  Also, the "MUL" flag seems to indicate
> that the key is non-unique, when in fact it is.

This output format of DESCRIBE TABLE has been discussed before. It is not
easily understandable, though the above is what Monty intended it to be.

I recommend using

SHOW CREATE TABLE tablename;

to look at a table structure. It contains the foreign key definitions and
all. DESCRIBE TABLE does not contain all information.

Regards,

Heikki

----- Original Message -----
From: "Matt Solnit" <[EMAIL PROTECTED]>
To: "Heikki Tuuri" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Cc: "Henry Bequet" <[EMAIL PROTECTED]>
Sent: Saturday, December 28, 2002 2:44 AM
Subject: Bug report: UNIQUE KEY and DESCRIBE TABLE


===============================================
Bug report -- MySQL v4.06, binary distribution
===============================================

--------------
Machine specs:
--------------
Compaq Presario desktop
512 MB RAM
Windows XP Professional SP1

--------------------
Problem description:
--------------------
MySQL does not return key information about any column after the first
in a unique multi-column key.  Also, the "MUL" flag seems to indicate
that the key is non-unique, when in fact it is.

There is an equivalent symptom in the MySQL C API.  In the flags field
of the MYSQL_FIELD structure returned by mysql_fetch_field(), the
MULTIPLE_KEY_FLAG will only be present in the first column.

-------------
Test script:
-------------
mysql>USE test
mysql>CREATE TABLE mytable (a INT NOT NULL, b INT NOT NULL, c INT NOT
NULL, d INT NOT NULL, PRIMARY KEY (a), UNIQUE KEY (b, c));
mysql>DESCRIBE TABLE mytable;

------------------
Results:
------------------
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a     | int(11) |      | PRI | 0       |       |
| b     | int(11) |      | MUL | 0       |       |
| c     | int(11) |      |     | 0       |       |
| d     | int(11) |      |     | 0       |       |
+-------+---------+------+-----+---------+-------+

----------------
C test program:
----------------

/***********************************************
Expected output (according to manual section 8.4.1):

Column `a`: primary=1, unique=0, multiple=0
Column `b`: primary=0, unique=1, multiple=0
Column `c`: primary=0, unique=1, multiple=0
Column `d`: primary=0, unique=0, multiple=0

Actual output:

Column `a`: primary=1, unique=0, multiple=0
Column `b`: primary=0, unique=0, multiple=1
Column `c`: primary=0, unique=0, multiple=0
Column `d`: primary=0, unique=0, multiple=0
***********************************************/

#include "stdafx.h"
#include <winsock.h>
#include <mysql.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

MYSQL *db_connect(const char *dbname);
void db_disconnect(MYSQL *db);
void db_do_query(MYSQL *db, const char *query);

const char *server_groups[] = {
  "test_libmysqld_SERVER", "embedded", "server", NULL
};

int main(int argc, char* argv[])
{
  MYSQL *one;

  mysql_server_init(argc, argv, (char **)server_groups);
  one = db_connect("test");

  const char* query = "SELECT * FROM mytable";
  mysql_query(one, query);
  MYSQL_RES* res = mysql_store_result(one);
  int numFields = mysql_num_fields(res);
  for (int i = 0; i < numFields; i++)
  {
    MYSQL_FIELD* fld = mysql_fetch_field(res);
    char* name = strdup(fld->name);
    bool isPrimary = ((fld->flags & PRI_KEY_FLAG) > 0);
    bool isUnique = ((fld->flags & UNIQUE_KEY_FLAG) > 0);
    bool isMulti = ((fld->flags & MULTIPLE_KEY_FLAG) > 0);
    printf("column `%s`: primary=%d, unique=%d, multiple=%d\n", name,
isPrimary, isUnique, isMulti);
  }

  mysql_close(one);
  mysql_server_end();

  return 0;
}

static void
die(MYSQL *db, char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  (void)putc('\n', stderr);
  if (db)
    db_disconnect(db);
  exit(EXIT_FAILURE);
}

MYSQL *
db_connect(const char *dbname)
{
  MYSQL *db = mysql_init(NULL);
  if (!db)
    die(db, "mysql_init failed: no memory");
  /*
   * Notice that the client and server use separate group names.
   * This is critical, because the server will not accept the
   * client's options, and vice versa.
   */
  mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT");
  if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0))
    die(db, "mysql_real_connect failed: %s", mysql_error(db));

  return db;
}

void
db_disconnect(MYSQL *db)
{
  mysql_close(db);
}

-----------------------
My contact information:
-----------------------
Matt Solnit <[EMAIL PROTECTED]>



---------------------------------------------------------------------
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

Reply via email to